boot.ldscript revision 1.1
11.1Smatt/* Script for -N: mix text and data on same page; don't align data */ 21.1SmattOUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", 31.1Smatt "elf32-tradlittlemips") 41.1SmattOUTPUT_ARCH(mips) 51.1SmattENTRY(__start) 61.1SmattSEARCH_DIR("=/usr/lib"); 71.1SmattSECTIONS 81.1Smatt{ 91.1Smatt /* Read-only sections, merged into text segment: */ 101.1Smatt PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x20000000)); . = SEGMENT_START("text-segment", 0x20000000) + SIZEOF_HEADERS; 111.1Smatt .interp : { *(.interp) } 121.1Smatt .reginfo : { *(.reginfo) } 131.1Smatt .note.gnu.build-id : { *(.note.gnu.build-id) } 141.1Smatt .dynamic : { *(.dynamic) } 151.1Smatt .hash : { *(.hash) } 161.1Smatt .gnu.hash : { *(.gnu.hash) } 171.1Smatt .dynsym : { *(.dynsym) } 181.1Smatt .dynstr : { *(.dynstr) } 191.1Smatt .gnu.version : { *(.gnu.version) } 201.1Smatt .gnu.version_d : { *(.gnu.version_d) } 211.1Smatt .gnu.version_r : { *(.gnu.version_r) } 221.1Smatt .rel.init : { *(.rel.init) } 231.1Smatt .rela.init : { *(.rela.init) } 241.1Smatt .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } 251.1Smatt .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } 261.1Smatt .rel.fini : { *(.rel.fini) } 271.1Smatt .rela.fini : { *(.rela.fini) } 281.1Smatt .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } 291.1Smatt .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } 301.1Smatt .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) } 311.1Smatt .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) } 321.1Smatt .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } 331.1Smatt .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } 341.1Smatt .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } 351.1Smatt .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } 361.1Smatt .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } 371.1Smatt .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } 381.1Smatt .rel.ctors : { *(.rel.ctors) } 391.1Smatt .rela.ctors : { *(.rela.ctors) } 401.1Smatt .rel.dtors : { *(.rel.dtors) } 411.1Smatt .rela.dtors : { *(.rela.dtors) } 421.1Smatt .rel.got : { *(.rel.got) } 431.1Smatt .rela.got : { *(.rela.got) } 441.1Smatt .rel.dyn : { *(.rel.dyn) } 451.1Smatt .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) } 461.1Smatt .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) } 471.1Smatt .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) } 481.1Smatt .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) } 491.1Smatt .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) } 501.1Smatt .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) } 511.1Smatt .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) } 521.1Smatt .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) } 531.1Smatt .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } 541.1Smatt .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } 551.1Smatt .rel.iplt : 561.1Smatt { 571.1Smatt PROVIDE_HIDDEN (__rel_iplt_start = .); 581.1Smatt *(.rel.iplt) 591.1Smatt PROVIDE_HIDDEN (__rel_iplt_end = .); 601.1Smatt } 611.1Smatt .rela.iplt : 621.1Smatt { 631.1Smatt PROVIDE_HIDDEN (__rela_iplt_start = .); 641.1Smatt *(.rela.iplt) 651.1Smatt PROVIDE_HIDDEN (__rela_iplt_end = .); 661.1Smatt } 671.1Smatt .rel.plt : 681.1Smatt { 691.1Smatt *(.rel.plt) 701.1Smatt } 711.1Smatt .rela.plt : 721.1Smatt { 731.1Smatt *(.rela.plt) 741.1Smatt } 751.1Smatt .init : 761.1Smatt { 771.1Smatt KEEP (*(.init)) 781.1Smatt } =0 791.1Smatt .plt : { *(.plt) } 801.1Smatt .iplt : { *(.iplt) } 811.1Smatt .text : 821.1Smatt { 831.1Smatt _ftext = . ; 841.1Smatt *(.text.unlikely .text.*_unlikely) 851.1Smatt *(.text.exit .text.exit.*) 861.1Smatt *(.text.startup .text.startup.*) 871.1Smatt *(.text.hot .text.hot.*) 881.1Smatt *(.text .stub .text.* .gnu.linkonce.t.*) 891.1Smatt /* .gnu.warning sections are handled specially by elf32.em. */ 901.1Smatt *(.gnu.warning) 911.1Smatt *(.mips16.fn.*) *(.mips16.call.*) 921.1Smatt } =0 931.1Smatt .fini : 941.1Smatt { 951.1Smatt KEEP (*(.fini)) 961.1Smatt } =0 971.1Smatt PROVIDE (__etext = .); 981.1Smatt PROVIDE (_etext = .); 991.1Smatt PROVIDE (etext = .); 1001.1Smatt .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } 1011.1Smatt .rodata1 : { *(.rodata1) } 1021.1Smatt .sdata2 : 1031.1Smatt { 1041.1Smatt *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) 1051.1Smatt } 1061.1Smatt .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } 1071.1Smatt .eh_frame_hdr : { *(.eh_frame_hdr) } 1081.1Smatt .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } 1091.1Smatt .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } 1101.1Smatt /* Adjust the address for the data segment. We want to adjust up to 1111.1Smatt the same address within the page on the next page up. */ 1121.1Smatt . = .; 1131.1Smatt /* Exception handling */ 1141.1Smatt .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } 1151.1Smatt .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } 1161.1Smatt /* Thread Local Storage sections */ 1171.1Smatt .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } 1181.1Smatt .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } 1191.1Smatt .preinit_array : 1201.1Smatt { 1211.1Smatt PROVIDE_HIDDEN (__preinit_array_start = .); 1221.1Smatt KEEP (*(.preinit_array)) 1231.1Smatt PROVIDE_HIDDEN (__preinit_array_end = .); 1241.1Smatt } 1251.1Smatt .init_array : 1261.1Smatt { 1271.1Smatt PROVIDE_HIDDEN (__init_array_start = .); 1281.1Smatt KEEP (*(SORT(.init_array.*))) 1291.1Smatt KEEP (*(.init_array)) 1301.1Smatt PROVIDE_HIDDEN (__init_array_end = .); 1311.1Smatt } 1321.1Smatt .fini_array : 1331.1Smatt { 1341.1Smatt PROVIDE_HIDDEN (__fini_array_start = .); 1351.1Smatt KEEP (*(SORT(.fini_array.*))) 1361.1Smatt KEEP (*(.fini_array)) 1371.1Smatt PROVIDE_HIDDEN (__fini_array_end = .); 1381.1Smatt } 1391.1Smatt .ctors : 1401.1Smatt { 1411.1Smatt /* gcc uses crtbegin.o to find the start of 1421.1Smatt the constructors, so we make sure it is 1431.1Smatt first. Because this is a wildcard, it 1441.1Smatt doesn't matter if the user does not 1451.1Smatt actually link against crtbegin.o; the 1461.1Smatt linker won't look for a file to match a 1471.1Smatt wildcard. The wildcard also means that it 1481.1Smatt doesn't matter which directory crtbegin.o 1491.1Smatt is in. */ 1501.1Smatt KEEP (*crtbegin.o(.ctors)) 1511.1Smatt KEEP (*crtbegin?.o(.ctors)) 1521.1Smatt /* We don't want to include the .ctor section from 1531.1Smatt the crtend.o file until after the sorted ctors. 1541.1Smatt The .ctor section from the crtend file contains the 1551.1Smatt end of ctors marker and it must be last */ 1561.1Smatt KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) 1571.1Smatt KEEP (*(SORT(.ctors.*))) 1581.1Smatt KEEP (*(.ctors)) 1591.1Smatt } 1601.1Smatt .dtors : 1611.1Smatt { 1621.1Smatt KEEP (*crtbegin.o(.dtors)) 1631.1Smatt KEEP (*crtbegin?.o(.dtors)) 1641.1Smatt KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) 1651.1Smatt KEEP (*(SORT(.dtors.*))) 1661.1Smatt KEEP (*(.dtors)) 1671.1Smatt } 1681.1Smatt .jcr : { KEEP (*(.jcr)) } 1691.1Smatt .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } 1701.1Smatt .data : 1711.1Smatt { 1721.1Smatt _fdata = . ; 1731.1Smatt *(.data .data.* .gnu.linkonce.d.*) 1741.1Smatt SORT(CONSTRUCTORS) 1751.1Smatt } 1761.1Smatt .data1 : { *(.data1) } 1771.1Smatt .got.plt : { *(.got.plt) } 1781.1Smatt . = .; 1791.1Smatt _gp = ALIGN(16) + 0x7ff0; 1801.1Smatt .got : { *(.got) } 1811.1Smatt /* We want the small data sections together, so single-instruction offsets 1821.1Smatt can access them all, and initialized data all before uninitialized, so 1831.1Smatt we can shorten the on-disk segment size. */ 1841.1Smatt .sdata : 1851.1Smatt { 1861.1Smatt *(.sdata .sdata.* .gnu.linkonce.s.*) 1871.1Smatt } 1881.1Smatt .lit8 : { *(.lit8) } 1891.1Smatt .lit4 : { *(.lit4) } 1901.1Smatt _edata = .; PROVIDE (edata = .); 1911.1Smatt __bss_start = .; 1921.1Smatt _fbss = .; 1931.1Smatt .sbss : 1941.1Smatt { 1951.1Smatt *(.dynsbss) 1961.1Smatt *(.sbss .sbss.* .gnu.linkonce.sb.*) 1971.1Smatt *(.scommon) 1981.1Smatt } 1991.1Smatt .bss : 2001.1Smatt { 2011.1Smatt *(.dynbss) 2021.1Smatt *(.bss .bss.* .gnu.linkonce.b.*) 2031.1Smatt *(COMMON) 2041.1Smatt /* Align here to ensure that the .bss section occupies space up to 2051.1Smatt _end. Align after .bss to ensure correct alignment even if the 2061.1Smatt .bss section disappears because there are no input sections. 2071.1Smatt FIXME: Why do we need it? When there is no .bss section, we don't 2081.1Smatt pad the .data section. */ 2091.1Smatt . = ALIGN(. != 0 ? 32 / 8 : 1); 2101.1Smatt } 2111.1Smatt . = ALIGN(32 / 8); 2121.1Smatt . = ALIGN(32 / 8); 2131.1Smatt _end = .; PROVIDE (end = .); 2141.1Smatt /* Stabs debugging sections. */ 2151.1Smatt .stab 0 : { *(.stab) } 2161.1Smatt .stabstr 0 : { *(.stabstr) } 2171.1Smatt .stab.excl 0 : { *(.stab.excl) } 2181.1Smatt .stab.exclstr 0 : { *(.stab.exclstr) } 2191.1Smatt .stab.index 0 : { *(.stab.index) } 2201.1Smatt .stab.indexstr 0 : { *(.stab.indexstr) } 2211.1Smatt .comment 0 : { *(.comment) } 2221.1Smatt /* DWARF debug sections. 2231.1Smatt Symbols in the DWARF debugging sections are relative to the beginning 2241.1Smatt of the section so we begin them at 0. */ 2251.1Smatt /* DWARF 1 */ 2261.1Smatt .debug 0 : { *(.debug) } 2271.1Smatt .line 0 : { *(.line) } 2281.1Smatt /* GNU DWARF 1 extensions */ 2291.1Smatt .debug_srcinfo 0 : { *(.debug_srcinfo) } 2301.1Smatt .debug_sfnames 0 : { *(.debug_sfnames) } 2311.1Smatt /* DWARF 1.1 and DWARF 2 */ 2321.1Smatt .debug_aranges 0 : { *(.debug_aranges) } 2331.1Smatt .debug_pubnames 0 : { *(.debug_pubnames) } 2341.1Smatt /* DWARF 2 */ 2351.1Smatt .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } 2361.1Smatt .debug_abbrev 0 : { *(.debug_abbrev) } 2371.1Smatt .debug_line 0 : { *(.debug_line) } 2381.1Smatt .debug_frame 0 : { *(.debug_frame) } 2391.1Smatt .debug_str 0 : { *(.debug_str) } 2401.1Smatt .debug_loc 0 : { *(.debug_loc) } 2411.1Smatt .debug_macinfo 0 : { *(.debug_macinfo) } 2421.1Smatt /* SGI/MIPS DWARF 2 extensions */ 2431.1Smatt .debug_weaknames 0 : { *(.debug_weaknames) } 2441.1Smatt .debug_funcnames 0 : { *(.debug_funcnames) } 2451.1Smatt .debug_typenames 0 : { *(.debug_typenames) } 2461.1Smatt .debug_varnames 0 : { *(.debug_varnames) } 2471.1Smatt /* DWARF 3 */ 2481.1Smatt .debug_pubtypes 0 : { *(.debug_pubtypes) } 2491.1Smatt .debug_ranges 0 : { *(.debug_ranges) } 2501.1Smatt .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } 2511.1Smatt .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } 2521.1Smatt .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } 2531.1Smatt .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) } 2541.1Smatt .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) } 2551.1Smatt .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) } 2561.1Smatt .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) } 2571.1Smatt .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) } 2581.1Smatt .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) } 2591.1Smatt .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) } 2601.1Smatt .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) } 2611.1Smatt /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } 2621.1Smatt} 263