/* * This file contains directives for the GNU linker which are specific * to the virtex * This file is intended to be used together with dlentry.s * it will generate downloadable code * * Modifications for gen405 by Dennis Ehlin * Modifications for virtex by Keith, Greg, and Bob * * $Id$ */ OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") OUTPUT_ARCH(powerpc) ENTRY(download_entry) RamBase = DEFINED(RamBase) ? RamBase : 0x0; RamSize = DEFINED(RamSize) ? RamSize : 128M; HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0; MEMORY { RAM : ORIGIN = 0, LENGTH = 128M /*FLASH : ORIGIN = 0xFFE00000, LENGTH = 16M*/ } SECTIONS { .text 0x10000: { text.start = . ; *(.entry) *(.entry2) *(.text*) *(.rodata*) *(.rodata1) /* * Special FreeBSD sysctl sections. */ . = ALIGN (16); __start_set_sysctl_set = .; *(set_sysctl_*); __stop_set_sysctl_set = ABSOLUTE(.); *(set_domain_*); *(set_pseudo_*); /* 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__ = .); *crtbegin.o(.ctors) *(.ctors) *crtend.o(.ctors) LONG(0) PROVIDE (__CTOR_END__ = .); PROVIDE (__DTOR_LIST__ = .); *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) *(.descriptors) *(rom_ver) _erodata = .; PROVIDE (__EXCEPT_START__ = .); *(.gcc_except_table*) PROVIDE (__EXCEPT_END__ = .); __GOT_START__ = .; s.got = .; *(.got.plt) *(.got) *(.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__ = .); /* Various possible names for the end of the .text section */ etext = ALIGN(0x10); _etext = .; *(.lit) *(.shdata) _endtext = ALIGN(0x10); text.end = .; text.size = text.end - text.start; } >RAM text.size = text.end - text.start; .jcr : { KEEP (*(.jcr)) } >RAM .rel.dyn : { *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) *(.rel.fini) *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) *(.rel.ctors) *(.rel.dtors) *(.rel.got) *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >RAM .rela.dyn : { *(.rela.init) *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) *(.rela.fini) *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) *(.rela.ctors) *(.rela.dtors) *(.rela.got) *(.rela.got1) *(.rela.got2) *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >RAM /* R/W Data */ .data ( . ) : { . = ALIGN (4); data.start = .; *(.data) *(.data1) *(.data.* .gnu.linkonce.d.*) data.end = .; data.size = data.end - data.start; } >RAM /* Arrange as follows: * sdata * sbss * bss * sbss2 * sdata2 * so that we have a contiguous 'bss' area * which can be zeroed in one sweep. * (sdata/sbss and sdata2/sbss2 must also be * contiguous). */ _SDA_BASE_ = __SDATA_START__ + 0x8000; .sdata : { *(.sdata .sdata.*) *(.gnu.linkonce.s.*) } > RAM _edata = .; .sbss : { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) } > RAM .bss : { *(.dynbss) *(.bss .bss* .gnu.linkonce.b*) *(COMMON) } >RAM _SDA2_BASE_ = __SBSS2_START__ + 0x8000; .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } > RAM .sdata2 : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) } > RAM PROVIDE(bss.start = __SBSS_START__); PROVIDE(bss.size = __SBSS2_END__ - __SBSS_START__); /* align bottom of 32k init stack at a 32k boundary */ . = . + 0x4000; . = ALIGN( 0x8000 ); stack.start = .; . = . + 0x8000; stack.end = .; /* * Interrupt stack setup */ IntrStack_start = ALIGN(0x10); . += 0x4000; IntrStack_end = .; PROVIDE(_end = . ); WorkAreaBase = .; .gzipmalloc : { . = ALIGN (16); _startmalloc = .; } >RAM /* Sections for compressed .text and .data */ /* after the .datarom section is an int specifying */ /* the length of the following compressed image */ /* Executes once then could get overwritten */ .textrom 0x100000 : { *(.textrom) _endloader = .; } >RAM .datarom : { _dr_start = .; *(.datarom) _dr_end = .; } >RAM dr_len = _dr_end - _dr_start; .line 0 : { *(.line) } .debug 0 : { *(.debug) } .debug_sfnames 0 : { *(.debug_sfnames) } .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_aranges 0 : { *(.debug_aranges) } .debug_aregion 0 : { *(.debug_aregion) } .debug_macinfo 0 : { *(.debug_macinfo) } .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } }