| STARTUP(crt0.o) |
| OUTPUT_ARCH(m68k) |
| /* Uncomment this if you want srecords. This is needed for a.out |
| * if you plan to use GDB. |
| OUTPUT_FORMAT(srec) |
| */ |
| |
| SEARCH_DIR(.) |
| GROUP(-lidpgdb -lc -lgcc) |
| __DYNAMIC = 0; |
| |
| /* |
| * Setup the memory map of the MC68ec0x0 Board (IDP) |
| * stack grows down from high memory. This works for |
| * both the rom68k and the mon68k monitors. |
| * |
| * The memory map look like this: |
| * +--------------------+ <- low memory |
| * | .text | |
| * | _etext | |
| * | ctor list | the ctor and dtor lists are for |
| * | dtor list | C++ support |
| * +--------------------+ |
| * | .data | initialized data goes here |
| * | _edata | |
| * +--------------------+ |
| * | .bss | |
| * | __bss_start | start of bss, cleared by crt0 |
| * | _end | start of heap, used by sbrk() |
| * +--------------------+ |
| * . . |
| * . . |
| * . . |
| * | __stack | top of stack |
| * +--------------------+ |
| */ |
| |
| /* |
| * When the IDP is not remapped (see rom68k's MP command in the |
| * "M68EC0x0IDP Users Manual", the first 64K bytes are reserved; |
| * Otherwise the first 256K bytes are reserved. |
| * |
| * The following memory map describes a unmapped IDP w/2MB RAM. |
| */ |
| |
| MEMORY |
| { |
| ram (rwx) : ORIGIN = 0x00010000, LENGTH = 2M-64K |
| rom0 : ORIGIN = 0x00800000, LENGTH = 1M |
| rom1 : ORIGIN = 0x00900000, LENGTH = 1M |
| } |
| |
| /* |
| * allocate the stack to be at the top of memory, since the stack |
| * grows down |
| */ |
| |
| PROVIDE (__stack = 2M - 8); |
| |
| /* |
| * Initalize some symbols to be zero so we can reference them in the |
| * crt0 without core dumping. These functions are all optional, but |
| * we do this so we can have our crt0 always use them if they exist. |
| * This is so BSPs work better when using the crt0 installed with gcc. |
| * We have to initalize them twice, so we cover a.out (which prepends |
| * an underscore) and coff object file formats. |
| */ |
| PROVIDE (hardware_init_hook = 0); |
| PROVIDE (_hardware_init_hook = 0); |
| PROVIDE (software_init_hook = 0); |
| PROVIDE (_software_init_hook = 0); |
| /* |
| * stick everything in ram (of course) |
| */ |
| SECTIONS |
| { |
| .text : |
| { |
| CREATE_OBJECT_SYMBOLS |
| *(.text .text.*) |
| |
| . = ALIGN(0x4); |
| /* These are for running static constructors and destructors under ELF. */ |
| KEEP (*crtbegin.o(.ctors)) |
| KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) |
| KEEP (*(SORT(.ctors.*))) |
| KEEP (*(.ctors)) |
| KEEP (*crtbegin.o(.dtors)) |
| KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) |
| KEEP (*(SORT(.dtors.*))) |
| KEEP (*(.dtors)) |
| |
| *(.rodata .rodata.*) |
| |
| . = ALIGN(0x4); |
| *(.gcc_except_table) |
| |
| . = ALIGN(0x4); |
| *(.eh_frame) |
| |
| . = ALIGN(0x4); |
| __INIT_SECTION__ = . ; |
| LONG (0x4e560000) /* linkw %fp,#0 */ |
| *(.init) |
| SHORT (0x4e5e) /* unlk %fp */ |
| SHORT (0x4e75) /* rts */ |
| |
| . = ALIGN(0x4); |
| __FINI_SECTION__ = . ; |
| LONG (0x4e560000) /* linkw %fp,#0 */ |
| *(.fini) |
| SHORT (0x4e5e) /* unlk %fp */ |
| SHORT (0x4e75) /* rts */ |
| |
| _etext = .; |
| *(.lit) |
| } > ram |
| |
| .data : |
| { |
| *(.got.plt) *(.got) |
| *(.shdata) |
| *(.data .data.*) |
| _edata = .; |
| } > ram |
| |
| .bss : |
| { |
| . = ALIGN(0x4); |
| __bss_start = . ; |
| *(.shbss) |
| *(.bss .bss.*) |
| *(COMMON) |
| _end = ALIGN (0x8); |
| __end = _end; |
| } > ram |
| |
| .stab 0 (NOLOAD) : |
| { |
| *(.stab) |
| } |
| |
| .stabstr 0 (NOLOAD) : |
| { |
| *(.stabstr) |
| } |
| } |