OUTPUT_FORMAT("elf32-powerpc") OUTPUT_ARCH(powerpc:common) ENTRY(_start) MEMORY { system (rwx) : ORIGIN = 0x01000000, LENGTH = 32M code (rwx) : ORIGIN = 0x02000000, LENGTH = 224M data (rw) : ORIGIN = 0x10000000, LENGTH = 800M load (rwx) : ORIGIN = 0xC0000000, LENGTH = 128M } PHDRS { hdr_text PT_LOAD FILEHDR PHDRS FLAGS(0x01 | 0x04); hdr_data PT_LOAD FLAGS(0x02 | 0x04); hdr_srodata PT_LOAD FLAGS(0x04); hdr_sdata PT_LOAD FLAGS(0x02 | 0x04); } SECTIONS { . = ORIGIN(code); .syscall ALIGN(32) : { *(.syscall) } : hdr_text /* Standard code section */ .text ALIGN(32) : { /* .init */ KEEP( *(.crt0) ) KEEP( *(.init) ) . = ALIGN(4); /* .text */ *(.text) *(.text.*) *(.rodata .rodata.*) *(.gnu.linkonce.r.*) *(.rodata1) *(.glue_7) *(.glue_7t) *(.stub) *(.gnu.warning) *(.gnu.linkonce.t*) . = ALIGN(4); *(.rplTramp.text) *(SORT(.rplTramp.text.*)) . = ALIGN(4); /* .fini */ KEEP( *(.fini) ) . = ALIGN(4); } : hdr_text /* Standard data sections */ . = ORIGIN(data); .data ALIGN(256) : { *(.data) *(.data.*) *(.eh_frame) *(.eh_frame_hdr) *(.gnu.linkonce.d.*) SORT(CONSTRUCTORS) . = ALIGN(32); __sdata_start = .; *(.sdata) *(.sdata.*) __sdata_end = .; . = ALIGN(32); __sdata2_start = .; *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) __sdata2_end = .; } : hdr_sdata .tdata ALIGN(256) : { __tdata_lma = .; *(.tdata) *(.tdata.*) *(.gnu.linkonce.td.*) . = ALIGN(4); __tdata_lma_end = .; } : hdr_data .preinit_array ALIGN(256) : { PROVIDE (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE (__preinit_array_end = .); } : hdr_data .init_array ALIGN(256) : { PROVIDE (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) PROVIDE (__init_array_end = .); } : hdr_data .fini_array ALIGN(256) : { PROVIDE (__fini_array_start = .); KEEP (*(.fini_array)) KEEP (*(SORT(.fini_array.*))) PROVIDE (__fini_array_end = .); } : hdr_data .ctors ALIGN(256) : { KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } : hdr_data .dtors ALIGN(256) : { KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } : hdr_data __bss_start__ = .; .bss ALIGN(256) : { *(.dynbss) *(.bss) *(.bss.*) *(.gnu.linkonce.b*) *(COMMON) . = ALIGN(32); __sbss_start = .; *(.sbss) *(.sbss.*) __sbss_end = .; . = ALIGN(32); __sbss2_start = .; *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) __sbss2_end = .; . = ALIGN(32); /* Reserve space for the TLS segment of the main thread */ __tls_start = .; __tbss_start = .; *(.tbss) *(.tbss.*) *(.gnu.linkonce.tb.*) *(.tcommon) __tbss_end = .; . += + SIZEOF(.tdata); __tls_end = .; . = ALIGN(32); } : hdr_data __bss_end__ = .; /* System stuff is for our elf2rpl converter to go through */ . = ORIGIN(system); /* Contains the name of RPLs, referenced by .lib.rplLibs */ .rodata.rplNames ALIGN(32) : { *(.rodata.rplNames) } : hdr_data /* * List of RPL libraries to import, in format: * uint32_t nameAddress -> .rodata.rplNames * uint32_t firstFuncEntry -> .data.rplFuncStubs */ .lib.rplLibs ALIGN(32) : { *(.lib.rplLibs) } /* * List of functions an RPL exports, in format: * uint32_t trampAddress */ .data.rplFuncStubs ALIGN(32) : { *(.data.rplFuncStubs) } /* Required compiler trash */ .fixup ALIGN(32) : { *(.fixup*) } .got ALIGN(32) : { *(.got*) } .gcc_except_table ALIGN(32) : { *(.gcc_except_table*) } .hash ALIGN(32) : { *(.hash) } .dynsym ALIGN(32) : { *(.dynsym) } /* Put all dynamic loader relocations into one section */ .rela.dyn ALIGN(32) : { *(.rela.dyn) *(.rela.data.rplFuncStubs) *(.rela.lib.rplLibs) } /* Relocations for .rodata sections */ .rela.rodata ALIGN(32) : { *(.rela.rodata .rela.rodata.*) } /* Relocations for .text sections */ .rela.text ALIGN(32) : { *(.rela.text .rela.text.*) *(.rela.rplTramp.text) } /* Relocations for .data sections */ .rela.data ALIGN(32) : { *(.rela.data .rela.data.*) } /* Relocations for .bss sections */ .rela.bss ALIGN(32) : { *(.rela.bss .rela.bss.*) } /* Symbol tables */ .shstrtab ALIGN(32) : { *(.shstrtab) } .symtab ALIGN(32) : { *(.symtab) } .strtab ALIGN(32) : { *(.strtab) } /DISCARD/ : { *(.interp) *(.dynstr) *(.dynamic) *(.comment) } __SDATA_START__ = __sdata_start; __SBSS_END__ = __sbss_end; __SDATA2_START__ = __sdata2_start; __SBSS2_END__ = __sbss2_end; _SDA_BASE_ = __sbss_end; _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2); }