/* * This file contains directives for the GNU linker that are specific * to the MBX860-2 board. * * $Id$ */ OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") OUTPUT_ARCH(powerpc) ENTRY(start) /* * Declare some sizes. * XXX: The assignment of ". += XyzSize;" fails in older gld's if the * number used there is not constant. If this happens to you, edit * the lines marked XXX below to use a constant value. */ HeapSize = DEFINED(HeapSize) ? HeapSize : 0x100000; /* 1M Heap */ StackSize = DEFINED(StackSize) ? StackSize : 0x1000; MEMORY { ram : org = 0x0, l = 4M nvram : org = 0xfa000000, l = 32K dpram : org = 0xfa200000, l = 16K flash : org = 0xfc000000, l = 2M immr : org = 0xfa200000, l = 16K } SECTIONS { /* * If the vectors are specified statically rather than created at run time, * accumulate them starting at VMA 0x0. */ .vectors : { *(.vectors) } >ram /* * The stack will live in this area - between the vectors and * the text section. */ .text 0x10000: { /* Read-only sections, merged into text segment: */ text.start = .; /* Entry point is the .entry section */ *(.entry) *(.entry2) /* Actual code */ *(.text) *(.text.*) /* C++ constructors/destructors */ *(.gnu.linkonce.t*) /* Initialization and finalization code. * * Various files can provide initialization and finalization functions. * The bodies of these functions are in .init and .fini sections. We * accumulate the bodies here, and prepend function prologues from * ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked * first; ecrtn.o must be linked last. Because these are wildcards, it * doesn't matter if the user does not actually link against ecrti.o and * ecrtn.o; the linker won't look for a file to match a wildcard. The * wildcard also means that it doesn't matter which directory ecrti.o * and ecrtn.o are in. */ PROVIDE (_init = .); *ecrti.o(.init) *(.init) *ecrtn.o(.init) PROVIDE (_fini = .); *ecrti.o(.fini) *(.fini) *ecrtn.o(.init) /* * C++ constructors and destructors for static objects. * PowerPC EABI does not use crtstuff yet, so we build "old-style" * constructor and destructor lists that begin with the list lenght * end terminate with a NULL entry. */ PROVIDE (__CTOR_LIST__ = .); /* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */ *crtbegin.o(.ctors) *(.ctors) *crtend.o(.ctors) LONG(0) PROVIDE (__CTOR_END__ = .); PROVIDE (__DTOR_LIST__ = .); /* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */ *crtbegin.o(.dtors) *(.dtors) *crtend.o(.dtors) LONG(0) PROVIDE (__DTOR_END__ = .); /* Exception frame info */ *(.eh_frame) /* Miscellaneous read-only data */ _rodata_start = . ; *(.gnu.linkonce.r*) *(.lit) *(.shdata) *(.rodata*) *(.rodata1) *.(eh_frame) *(.descriptors) *(rom_ver) _erodata = .; /* Various possible names for the end of the .text section */ etext = ALIGN(0x10); _etext = .; _endtext = .; text.end = .; PROVIDE (etext = .); PROVIDE (__etext = .); } > ram /* R/W Data */ .data : { data_start = .; *(.data) *(.data.*) *(.data1) PROVIDE (__SDATA_START__ = .); *(.sdata) *(.gnu.linkonce.d*) *(.gnu.linkonce.s.*) PROVIDE (__SDATA_END__ = .); PROVIDE (__EXCEPT_START__ = .); *(.gcc_except_table) PROVIDE (__EXCEPT_END__ = .); PROVIDE(__GOT_START__ = .); *(.got.plt) *(.got) PROVIDE(__GOT_END__ = .); *(.got1) PROVIDE (__GOT2_START__ = .); PROVIDE (_GOT2_START_ = .); *(.got2) PROVIDE (__GOT2_END__ = .); PROVIDE (_GOT2_END_ = .); PROVIDE (__FIXUP_START__ = .); PROVIDE (_FIXUP_START_ = .); *(.fixup) PROVIDE (_FIXUP_END_ = .); PROVIDE (__FIXUP_END__ = .); /* We want the small data sections together, so single-instruction offsets * can access them all. */ PROVIDE (__SDATA2_START__ = .); *(.sdata2) *(.gnu.linkonce.s2.*) *(.sbss2) PROVIDE (__SDATA2_END__ = .); } > ram .bss : { PROVIDE (__SBSS_START__ = .); PROVIDE (__SBSS2_START__ = .); *(.sbss2) PROVIDE (__SBSS2_END__ = .); bss.start = .; *(.bss) *(.sbss) *(COMMON) . = ALIGN(4); bss.end = .; PROVIDE (__SBSS_END__ = .); } > ram bss.size = bss.end - bss.start; text.size = text.end - text.start; PROVIDE(_end = bss.end); /* * Interrupt stack setup */ IntrStack_start = ALIGN(0x10); . += 0x4000; intrStack = .; PROVIDE(intrStackPtr = intrStack); _HeapStart = .; __HeapStart = .; . += HeapSize; /* XXX -- Old gld can't handle this */ /* . += 0x80000; */ /* HeapSize for old gld */ _HeapEnd = .; __HeapEnd = .; clear_end = .; _WorkspaceBase = .; __WorkspaceBase = .; dpram : { m8xx = .; _m8xx = .; . += (16 * 1024); } >immr /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* These must appear regardless of . */ }