Home | History | Annotate | Download | only in ldscripts
      1 /* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */
      2 OUTPUT_FORMAT("elf32-ntradlittlemips", "elf32-ntradbigmips",
      3 	      "elf32-ntradlittlemips")
      4 OUTPUT_ARCH(mips)
      5 ENTRY(__start)
      6 SECTIONS
      7 {
      8   /* Read-only sections, merged into text segment: */
      9   PROVIDE (__executable_start = 0); . = 0 + SIZEOF_HEADERS;
     10   .interp         : { *(.interp) }
     11   .reginfo        : { *(.reginfo) }
     12   .note.gnu.build-id : { *(.note.gnu.build-id) }
     13   .dynamic        : { *(.dynamic) }
     14   .hash           : { *(.hash) }
     15   .gnu.hash       : { *(.gnu.hash) }
     16   .dynsym         : { *(.dynsym) }
     17   .dynstr         : { *(.dynstr) }
     18   .gnu.version    : { *(.gnu.version) }
     19   .gnu.version_d  : { *(.gnu.version_d) }
     20   .gnu.version_r  : { *(.gnu.version_r) }
     21   .rel.dyn        :
     22     {
     23       *(.rel.init)
     24       *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
     25       *(.rel.fini)
     26       *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
     27       *(.rel.data.rel.ro .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*)
     28       *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
     29       *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
     30       *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
     31       *(.rel.ctors)
     32       *(.rel.dtors)
     33       *(.rel.got)
     34       *(.rel.dyn)
     35       *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
     36       *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
     37       *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
     38       *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
     39       *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
     40       PROVIDE_HIDDEN (__rel_iplt_start = .);
     41       *(.rel.iplt)
     42       PROVIDE_HIDDEN (__rel_iplt_end = .);
     43       PROVIDE_HIDDEN (__rela_iplt_start = .);
     44       PROVIDE_HIDDEN (__rela_iplt_end = .);
     45     }
     46   .rela.dyn       :
     47     {
     48       *(.rela.init)
     49       *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
     50       *(.rela.fini)
     51       *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
     52       *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
     53       *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
     54       *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
     55       *(.rela.ctors)
     56       *(.rela.dtors)
     57       *(.rela.got)
     58       *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
     59       *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
     60       *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
     61       *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
     62       *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
     63       PROVIDE_HIDDEN (__rel_iplt_start = .);
     64       PROVIDE_HIDDEN (__rel_iplt_end = .);
     65       PROVIDE_HIDDEN (__rela_iplt_start = .);
     66       *(.rela.iplt)
     67       PROVIDE_HIDDEN (__rela_iplt_end = .);
     68     }
     69   .rel.plt        :
     70     {
     71       *(.rel.plt)
     72     }
     73   .rela.plt       :
     74     {
     75       *(.rela.plt)
     76     }
     77   .init           :
     78   {
     79     KEEP (*(.init))
     80   }
     81   .plt            : { *(.plt) }
     82   .iplt           : { *(.iplt) }
     83   .text           :
     84   {
     85     _ftext = . ;
     86     *(.text.unlikely .text.*_unlikely)
     87     *(.text.exit .text.exit.*)
     88     *(.text.startup .text.startup.*)
     89     *(.text.hot .text.hot.*)
     90     *(.text .stub .text.* .gnu.linkonce.t.*)
     91     /* .gnu.warning sections are handled specially by elf32.em.  */
     92     *(.gnu.warning)
     93     *(.mips16.fn.*) *(.mips16.call.*)
     94   }
     95   .fini           :
     96   {
     97     KEEP (*(.fini))
     98   }
     99   PROVIDE (__etext = .);
    100   PROVIDE (_etext = .);
    101   PROVIDE (etext = .);
    102   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
    103   .rodata1        : { *(.rodata1) }
    104   .sdata2         :
    105   {
    106     *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
    107   }
    108   .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
    109   .eh_frame_hdr : { *(.eh_frame_hdr) }
    110   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
    111   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table
    112   .gcc_except_table.*) }
    113   /* These sections are generated by the Sun/Oracle C++ compiler.  */
    114   .exception_ranges   : ONLY_IF_RO { *(.exception_ranges
    115   .exception_ranges*) }
    116   /* Adjust the address for the data segment.  We want to align at exactly
    117      a page boundary to make life easier for apriori. */
    118   . = ALIGN (CONSTANT (MAXPAGESIZE)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
    119   /* Exception handling  */
    120   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
    121   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
    122   .exception_ranges   : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) }
    123   /* Thread Local Storage sections  */
    124   .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
    125   .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
    126   /* Ensure the __preinit_array_start label is properly aligned.  We
    127      could instead move the label definition inside the section, but
    128      the linker would then create the section even if it turns out to
    129      be empty, which isn't pretty.  */
    130   . = ALIGN(32 / 8);
    131   PROVIDE_HIDDEN (__preinit_array_start = .);
    132   .preinit_array     :
    133   {
    134     KEEP (*(.preinit_array))
    135   }
    136   PROVIDE_HIDDEN (__preinit_array_end = .);
    137   PROVIDE_HIDDEN (__init_array_start = .);
    138   .init_array     :
    139   {
    140     KEEP (*crtbegin*.o(.init_array))
    141     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
    142     KEEP (*(.init_array))
    143     KEEP (*(EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
    144   }
    145   PROVIDE_HIDDEN (__init_array_end = .);
    146   PROVIDE_HIDDEN (__fini_array_start = .);
    147   .fini_array     :
    148   {
    149     KEEP (*crtbegin*.o(.fini_array))
    150     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
    151     KEEP (*(.fini_array))
    152     KEEP (*(EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
    153   }
    154   PROVIDE_HIDDEN (__fini_array_end = .);
    155   .ctors          :
    156   {
    157     /* gcc uses crtbegin.o to find the start of
    158        the constructors, so we make sure it is
    159        first.  Because this is a wildcard, it
    160        doesn't matter if the user does not
    161        actually link against crtbegin.o; the
    162        linker won't look for a file to match a
    163        wildcard.  The wildcard also means that it
    164        doesn't matter which directory crtbegin.o
    165        is in.  */
    166     KEEP (*crtbegin.o(.ctors))
    167     KEEP (*crtbegin*.o(.ctors))
    168     /* We don't want to include the .ctor section from
    169        the crtend.o file until after the sorted ctors.
    170        The .ctor section from the crtend file contains the
    171        end of ctors marker and it must be last */
    172     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend*.o ) .ctors))
    173     KEEP (*(SORT(.ctors.*)))
    174     KEEP (*(.ctors))
    175   }
    176   .dtors          :
    177   {
    178     KEEP (*crtbegin.o(.dtors))
    179     KEEP (*crtbegin*.o(.dtors))
    180     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend*.o ) .dtors))
    181     KEEP (*(SORT(.dtors.*)))
    182     KEEP (*(.dtors))
    183   }
    184   .jcr            : { KEEP (*(.jcr)) }
    185   .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }
    186   .got.plt        : { *(.got.plt) }
    187   . = DATA_SEGMENT_RELRO_END (0, .);
    188   .data           :
    189   {
    190     _fdata = . ;
    191     *(.data .data.* .gnu.linkonce.d.*)
    192     SORT(CONSTRUCTORS)
    193   }
    194   .data1          : { *(.data1) }
    195   . = .;
    196   . = .;
    197   _gp = ALIGN(16) + 0x7ff0;
    198   .got            : { *(.got) }
    199   /* We want the small data sections together, so single-instruction offsets
    200      can access them all, and initialized data all before uninitialized, so
    201      we can shorten the on-disk segment size.  */
    202   .sdata          :
    203   {
    204     *(.sdata .sdata.* .gnu.linkonce.s.*)
    205   }
    206   .lit8           : { *(.lit8) }
    207   .lit4           : { *(.lit4) }
    208   .srdata         : { *(.srdata) }
    209   _edata = .; PROVIDE (edata = .);
    210   . = .;
    211   __bss_start = .;
    212   _fbss = .;
    213   .sbss           :
    214   {
    215     *(.dynsbss)
    216     *(.sbss .sbss.* .gnu.linkonce.sb.*)
    217     *(.scommon)
    218   }
    219   .bss            :
    220   {
    221    *(.dynbss)
    222    *(.bss .bss.* .gnu.linkonce.b.*)
    223    *(COMMON)
    224    /* Align here to ensure that the .bss section occupies space up to
    225       _end.  Align after .bss to ensure correct alignment even if the
    226       .bss section disappears because there are no input sections.  */
    227    . = ALIGN(32 / 8);
    228   }
    229   . = ALIGN(32 / 8);
    230   . = ALIGN(32 / 8);
    231   _end = .;
    232   _bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
    233   PROVIDE (end = .);
    234   . = DATA_SEGMENT_END (.);
    235   /* Stabs debugging sections.  */
    236   .stab          0 : { *(.stab) }
    237   .stabstr       0 : { *(.stabstr) }
    238   .stab.excl     0 : { *(.stab.excl) }
    239   .stab.exclstr  0 : { *(.stab.exclstr) }
    240   .stab.index    0 : { *(.stab.index) }
    241   .stab.indexstr 0 : { *(.stab.indexstr) }
    242   .comment       0 : { *(.comment) }
    243   /* DWARF debug sections.
    244      Symbols in the DWARF debugging sections are relative to the beginning
    245      of the section so we begin them at 0.  */
    246   /* DWARF 1 */
    247   .debug          0 : { *(.debug) }
    248   .line           0 : { *(.line) }
    249   /* GNU DWARF 1 extensions */
    250   .debug_srcinfo  0 : { *(.debug_srcinfo) }
    251   .debug_sfnames  0 : { *(.debug_sfnames) }
    252   /* DWARF 1.1 and DWARF 2 */
    253   .debug_aranges  0 : { *(.debug_aranges) }
    254   .debug_pubnames 0 : { *(.debug_pubnames) }
    255   /* DWARF 2 */
    256   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
    257   .debug_abbrev   0 : { *(.debug_abbrev) }
    258   .debug_line     0 : { *(.debug_line) }
    259   .debug_frame    0 : { *(.debug_frame) }
    260   .debug_str      0 : { *(.debug_str) }
    261   .debug_loc      0 : { *(.debug_loc) }
    262   .debug_macinfo  0 : { *(.debug_macinfo) }
    263   /* SGI/MIPS DWARF 2 extensions */
    264   .debug_weaknames 0 : { *(.debug_weaknames) }
    265   .debug_funcnames 0 : { *(.debug_funcnames) }
    266   .debug_typenames 0 : { *(.debug_typenames) }
    267   .debug_varnames  0 : { *(.debug_varnames) }
    268   /* DWARF 3 */
    269   .debug_pubtypes 0 : { *(.debug_pubtypes) }
    270   .debug_ranges   0 : { *(.debug_ranges) }
    271   /* DWARF Extension.  */
    272   .debug_macro    0 : { *(.debug_macro) }
    273   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
    274   .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
    275   .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
    276   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.mdebug.*) }
    277 }
    278