Home | History | Annotate | Download | only in scripttempl
      1 # Copyright (C) 2014 Free Software Foundation, Inc.
      2 # 
      3 # Copying and distribution of this file, with or without modification,
      4 # are permitted in any medium without royalty provided the copyright
      5 # notice and this notice are preserved.
      6 #
      7 # Unusual variables checked by this code:
      8 #	NOP - four byte opcode for no-op (defaults to 0)
      9 #	NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
     10 #		empty.
     11 #	SMALL_DATA_CTOR - .ctors contains small data.
     12 #	SMALL_DATA_DTOR - .dtors contains small data.
     13 #	DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
     14 #	INITIAL_READONLY_SECTIONS - at start of text segment
     15 #	OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
     16 #		(e.g., .PARISC.milli)
     17 #	OTHER_TEXT_SECTIONS - these get put in .text when relocating
     18 #	OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
     19 #		(e.g., .PARISC.global)
     20 #	OTHER_RELRO_SECTIONS - other than .data.rel.ro ...
     21 #		(e.g. PPC32 .fixup, .got[12])
     22 #	OTHER_BSS_SECTIONS - other than .bss .sbss ...
     23 #	ATTRS_SECTIONS - at the end
     24 #	OTHER_SECTIONS - at the end
     25 #	EXECUTABLE_SYMBOLS - symbols that must be defined for an
     26 #		executable (e.g., _DYNAMIC_LINK)
     27 #       TEXT_START_ADDR - the first byte of the text segment, after any
     28 #               headers.
     29 #       TEXT_BASE_ADDRESS - the first byte of the text segment.
     30 #	TEXT_START_SYMBOLS - symbols that appear at the start of the
     31 #		.text section.
     32 #	DATA_START_SYMBOLS - symbols that appear at the start of the
     33 #		.data section.
     34 #	DATA_END_SYMBOLS - symbols that appear at the end of the
     35 #		writeable data sections.
     36 #	OTHER_GOT_SYMBOLS - symbols defined just before .got.
     37 #	OTHER_GOT_SECTIONS - sections just after .got.
     38 #	OTHER_SDATA_SECTIONS - sections just after .sdata.
     39 #	OTHER_BSS_SYMBOLS - symbols that appear at the start of the
     40 #		.bss section besides __bss_start.
     41 #	DATA_PLT - .plt should be in data segment, not text segment.
     42 #	PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement.
     43 #	BSS_PLT - .plt should be in bss segment
     44 #	NO_REL_RELOCS - Don't include .rel.* sections in script
     45 #	NO_RELA_RELOCS - Don't include .rela.* sections in script
     46 #	NON_ALLOC_DYN - Place dynamic sections after data segment.
     47 #	TEXT_DYNAMIC - .dynamic in text segment, not data segment.
     48 #	EMBEDDED - whether this is for an embedded system. 
     49 #	SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
     50 #		start address of shared library.
     51 #	INPUT_FILES - INPUT command of files to always include
     52 #	WRITABLE_RODATA - if set, the .rodata section should be writable
     53 #	INIT_START, INIT_END -  statements just before and just after
     54 # 	combination of .init sections.
     55 #	FINI_START, FINI_END - statements just before and just after
     56 # 	combination of .fini sections.
     57 #	STACK_ADDR - start of a .stack section.
     58 #	OTHER_SYMBOLS - symbols to place right at the end of the script.
     59 #	ETEXT_NAME - name of a symbol for the end of the text section,
     60 #		normally etext.
     61 #	SEPARATE_GOTPLT - if set, .got.plt should be separate output section,
     62 #		so that .got can be in the RELRO area.  It should be set to
     63 #		the number of bytes in the beginning of .got.plt which can be
     64 #		in the RELRO area as well.
     65 #	USER_LABEL_PREFIX - prefix to add to user-visible symbols.
     66 #
     67 # When adding sections, do note that the names of some sections are used
     68 # when specifying the start address of the next.
     69 #
     70 
     71 #  Many sections come in three flavours.  There is the 'real' section,
     72 #  like ".data".  Then there are the per-procedure or per-variable
     73 #  sections, generated by -ffunction-sections and -fdata-sections in GCC,
     74 #  and useful for --gc-sections, which for a variable "foo" might be
     75 #  ".data.foo".  Then there are the linkonce sections, for which the linker
     76 #  eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
     77 #  The exact correspondences are:
     78 #
     79 #  Section	Linkonce section
     80 #  .text	.gnu.linkonce.t.foo
     81 #  .rodata	.gnu.linkonce.r.foo
     82 #  .data	.gnu.linkonce.d.foo
     83 #  .bss		.gnu.linkonce.b.foo
     84 #  .sdata	.gnu.linkonce.s.foo
     85 #  .sbss	.gnu.linkonce.sb.foo
     86 #  .sdata2	.gnu.linkonce.s2.foo
     87 #  .sbss2	.gnu.linkonce.sb2.foo
     88 #  .debug_info	.gnu.linkonce.wi.foo
     89 #  .tdata	.gnu.linkonce.td.foo
     90 #  .tbss	.gnu.linkonce.tb.foo
     91 #  .lrodata	.gnu.linkonce.lr.foo
     92 #  .ldata	.gnu.linkonce.l.foo
     93 #  .lbss	.gnu.linkonce.lb.foo
     94 #
     95 #  Each of these can also have corresponding .rel.* and .rela.* sections.
     96 
     97 test -z "$ENTRY" && ENTRY=_start
     98 test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
     99 test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
    100 if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
    101 test -z "${ELFSIZE}" && ELFSIZE=32
    102 test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
    103 test "$LD_FLAG" = "N" && DATA_ADDR=.
    104 test -z "${ETEXT_NAME}" && ETEXT_NAME=etext
    105 test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
    106 test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
    107 test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
    108 test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }"
    109 DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
    110 DATA_SEGMENT_RELRO_END=""
    111 DATA_SEGMENT_END=""
    112 if test -n "${COMMONPAGESIZE}"; then
    113   DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
    114   DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
    115   DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT-0}, .);"
    116 fi
    117 if test -z "${INITIAL_READONLY_SECTIONS}${CREATE_SHLIB}"; then
    118   INITIAL_READONLY_SECTIONS=".interp       ${RELOCATING-0} : { *(.interp) }"
    119 fi
    120 if test -z "$PLT"; then
    121   PLT=".plt          ${RELOCATING-0} : { *(.plt) }"
    122 fi
    123 test -n "${DATA_PLT-${BSS_PLT-text}}" && TEXT_PLT=yes
    124 if test -z "$GOT"; then
    125   if test -z "$SEPARATE_GOTPLT"; then
    126     GOT=".got          ${RELOCATING-0} : { *(.got.plt) *(.got) }"
    127   else
    128     GOT=".got          ${RELOCATING-0} : { *(.got) }"
    129     GOTPLT=".got.plt      ${RELOCATING-0} : { *(.got.plt) }"
    130   fi
    131 fi
    132 DYNAMIC=".dynamic      ${RELOCATING-0} : { *(.dynamic) }"
    133 RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
    134 DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
    135 DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
    136 if test -z "${NO_SMALL_DATA}"; then
    137   SBSS=".sbss         ${RELOCATING-0} :
    138   {
    139     ${RELOCATING+${SBSS_START_SYMBOLS}}
    140     ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)}
    141     *(.dynsbss)
    142     *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
    143     *(.scommon)
    144     ${RELOCATING+${SBSS_END_SYMBOLS}}
    145   }"
    146   SBSS2=".sbss2        ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
    147   SDATA="/* We want the small data sections together, so single-instruction offsets
    148      can access them all, and initialized data all before uninitialized, so
    149      we can shorten the on-disk segment size.  */
    150   .sdata        ${RELOCATING-0} : 
    151   {
    152     ${RELOCATING+${SDATA_START_SYMBOLS}}
    153     ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)}
    154     *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
    155   }"
    156   SDATA2=".sdata2       ${RELOCATING-0} :
    157   {
    158     ${RELOCATING+${SDATA2_START_SYMBOLS}}
    159     *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*})
    160   }"
    161   REL_SDATA=".rel.sdata    ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
    162   .rela.sdata   ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
    163   REL_SBSS=".rel.sbss     ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
    164   .rela.sbss    ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
    165   REL_SDATA2=".rel.sdata2   ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
    166   .rela.sdata2  ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
    167   REL_SBSS2=".rel.sbss2    ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
    168   .rela.sbss2   ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
    169 else
    170   NO_SMALL_DATA=" "
    171 fi
    172 if test -z "${DATA_GOT}"; then
    173   if test -n "${NO_SMALL_DATA}"; then
    174     DATA_GOT=" "
    175   fi
    176 fi
    177 if test -z "${SDATA_GOT}"; then
    178   if test -z "${NO_SMALL_DATA}"; then
    179     SDATA_GOT=" "
    180   fi
    181 fi
    182 test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
    183 test "${LARGE_SECTIONS}" = "yes" && REL_LARGE="
    184   .rel.ldata    ${RELOCATING-0} : { *(.rel.ldata${RELOCATING+ .rel.ldata.* .rel.gnu.linkonce.l.*}) }
    185   .rela.ldata   ${RELOCATING-0} : { *(.rela.ldata${RELOCATING+ .rela.ldata.* .rela.gnu.linkonce.l.*}) }
    186   .rel.lbss     ${RELOCATING-0} : { *(.rel.lbss${RELOCATING+ .rel.lbss.* .rel.gnu.linkonce.lb.*}) }
    187   .rela.lbss    ${RELOCATING-0} : { *(.rela.lbss${RELOCATING+ .rela.lbss.* .rela.gnu.linkonce.lb.*}) }
    188   .rel.lrodata  ${RELOCATING-0} : { *(.rel.lrodata${RELOCATING+ .rel.lrodata.* .rel.gnu.linkonce.lr.*}) }
    189   .rela.lrodata ${RELOCATING-0} : { *(.rela.lrodata${RELOCATING+ .rela.lrodata.* .rela.gnu.linkonce.lr.*}) }"
    190 test "${LARGE_SECTIONS}" = "yes" && OTHER_BSS_SECTIONS="
    191   ${OTHER_BSS_SECTIONS}
    192   .lbss ${RELOCATING-0} :
    193   {
    194     *(.dynlbss)
    195     *(.lbss${RELOCATING+ .lbss.* .gnu.linkonce.lb.*})
    196     *(LARGE_COMMON)
    197   }"
    198 test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
    199   .lrodata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
    200   {
    201     *(.lrodata${RELOCATING+ .lrodata.* .gnu.linkonce.lr.*})
    202   }
    203   .ldata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
    204   {
    205     *(.ldata${RELOCATING+ .ldata.* .gnu.linkonce.l.*})
    206     ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
    207   }"
    208 INIT_ARRAY=".init_array   ${RELOCATING-0} :
    209   {
    210      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}}
    211      KEEP (*(SORT(.init_array.*)))
    212      KEEP (*(.init_array))
    213      ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}}
    214   }"
    215 FINI_ARRAY=".fini_array   ${RELOCATING-0} :
    216   {
    217     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}}
    218     KEEP (*(SORT(.fini_array.*)))
    219     KEEP (*(.fini_array))
    220     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}}
    221   }"
    222 CTOR=".ctors        ${CONSTRUCTING-0} : 
    223   {
    224     ${CONSTRUCTING+${CTOR_START}}
    225     /* gcc uses crtbegin.o to find the start of
    226        the constructors, so we make sure it is
    227        first.  Because this is a wildcard, it
    228        doesn't matter if the user does not
    229        actually link against crtbegin.o; the
    230        linker won't look for a file to match a
    231        wildcard.  The wildcard also means that it
    232        doesn't matter which directory crtbegin.o
    233        is in.  */
    234 
    235     KEEP (*crtbegin.o(.ctors))
    236     KEEP (*crtbegin?.o(.ctors))
    237 
    238     /* We don't want to include the .ctor section from
    239        the crtend.o file until after the sorted ctors.
    240        The .ctor section from the crtend file contains the
    241        end of ctors marker and it must be last */
    242 
    243     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
    244     KEEP (*(SORT(.ctors.*)))
    245     KEEP (*(.ctors))
    246     ${CONSTRUCTING+${CTOR_END}}
    247   }"
    248 DTOR=".dtors        ${CONSTRUCTING-0} :
    249   {
    250     ${CONSTRUCTING+${DTOR_START}}
    251     KEEP (*crtbegin.o(.dtors))
    252     KEEP (*crtbegin?.o(.dtors))
    253     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
    254     KEEP (*(SORT(.dtors.*)))
    255     KEEP (*(.dtors))
    256     ${CONSTRUCTING+${DTOR_END}}
    257   }"
    258 STACK="  .stack        ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
    259   {
    260     ${RELOCATING+_stack = .;}
    261     *(.stack)
    262   }"
    263 
    264 TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${TEXT_START_ADDR})"
    265 SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${SHLIB_TEXT_START_ADDR:-0})"
    266 
    267 # If this is for an embedded system, don't add SIZEOF_HEADERS.
    268 if [ -z "$EMBEDDED" ]; then
    269    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
    270 else
    271    test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
    272 fi
    273 
    274 cat <<EOF
    275 /* Copyright (C) 2014 Free Software Foundation, Inc.
    276 
    277    Copying and distribution of this script, with or without modification,
    278    are permitted in any medium without royalty provided the copyright
    279    notice and this notice are preserved.  */
    280 
    281 OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
    282 	      "${LITTLE_OUTPUT_FORMAT}")
    283 OUTPUT_ARCH(${OUTPUT_ARCH})
    284 ${RELOCATING+ENTRY(${ENTRY})}
    285 
    286 ${RELOCATING+${LIB_SEARCH_DIRS}}
    287 ${RELOCATING+${EXECUTABLE_SYMBOLS}}
    288 ${RELOCATING+${INPUT_FILES}}
    289 ${RELOCATING- /* For some reason, the Solaris linker makes bad executables
    290   if gld -r is used and the intermediate file has sections starting
    291   at non-zero addresses.  Could be a Solaris ld bug, could be a GNU ld
    292   bug.  But for now assigning the zero vmas works.  */}
    293 
    294 SECTIONS
    295 {
    296   /* Read-only sections, merged into text segment: */
    297   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
    298   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS;}}
    299   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS;}}
    300   ${INITIAL_READONLY_SECTIONS}
    301   .note.gnu.build-id : { *(.note.gnu.build-id) }
    302 EOF
    303 
    304 test -n "${RELOCATING+0}" || unset NON_ALLOC_DYN
    305 test -z "${NON_ALLOC_DYN}" || TEXT_DYNAMIC=
    306 cat > ldscripts/dyntmp.$$ <<EOF
    307   ${TEXT_DYNAMIC+${DYNAMIC}}
    308   .hash         ${RELOCATING-0} : { *(.hash) }
    309   .gnu.hash     ${RELOCATING-0} : { *(.gnu.hash) }
    310   .dynsym       ${RELOCATING-0} : { *(.dynsym) }
    311   .dynstr       ${RELOCATING-0} : { *(.dynstr) }
    312   .gnu.version  ${RELOCATING-0} : { *(.gnu.version) }
    313   .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) }
    314   .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) }
    315 EOF
    316 
    317 if [ "x$COMBRELOC" = x ]; then
    318   COMBRELOCCAT="cat >> ldscripts/dyntmp.$$"
    319 else
    320   COMBRELOCCAT="cat > $COMBRELOC"
    321 fi
    322 eval $COMBRELOCCAT <<EOF
    323   .rel.init     ${RELOCATING-0} : { *(.rel.init) }
    324   .rela.init    ${RELOCATING-0} : { *(.rela.init) }
    325   .rel.text     ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
    326   .rela.text    ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
    327   .rel.fini     ${RELOCATING-0} : { *(.rel.fini) }
    328   .rela.fini    ${RELOCATING-0} : { *(.rela.fini) }
    329   .rel.rodata   ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
    330   .rela.rodata  ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
    331   ${OTHER_READONLY_RELOC_SECTIONS}
    332   .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+ .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*}) }
    333   .rela.data.rel.ro ${RELOCATING-0} : { *(.rela.data.rel.ro${RELOCATING+ .rela.data.rel.ro.* .rela.gnu.linkonce.d.rel.ro.*}) }
    334   .rel.data     ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
    335   .rela.data    ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
    336   .rel.tdata	${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
    337   .rela.tdata	${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
    338   .rel.tbss	${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
    339   .rela.tbss	${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
    340   .rel.ctors    ${RELOCATING-0} : { *(.rel.ctors) }
    341   .rela.ctors   ${RELOCATING-0} : { *(.rela.ctors) }
    342   .rel.dtors    ${RELOCATING-0} : { *(.rel.dtors) }
    343   .rela.dtors   ${RELOCATING-0} : { *(.rela.dtors) }
    344   .rel.got      ${RELOCATING-0} : { *(.rel.got) }
    345   .rela.got     ${RELOCATING-0} : { *(.rela.got) }
    346   ${OTHER_GOT_RELOC_SECTIONS}
    347   ${REL_SDATA}
    348   ${REL_SBSS}
    349   ${REL_SDATA2}
    350   ${REL_SBSS2}
    351   .rel.bss      ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
    352   .rela.bss     ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
    353   ${REL_LARGE}
    354 EOF
    355 
    356 if [ -n "$COMBRELOC" ]; then
    357 cat >> ldscripts/dyntmp.$$ <<EOF
    358   .rel.dyn      ${RELOCATING-0} :
    359     {
    360 EOF
    361 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC >> ldscripts/dyntmp.$$
    362 cat >> ldscripts/dyntmp.$$ <<EOF
    363     }
    364   .rel.ifunc.dyn      ${RELOCATING-0} :
    365     {
    366       *(.rel.ifunc.*)
    367     }
    368   .rela.dyn     ${RELOCATING-0} :
    369     {
    370 EOF
    371 sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC >> ldscripts/dyntmp.$$
    372 cat >> ldscripts/dyntmp.$$ <<EOF
    373     }
    374   .rela.ifunc.dyn     ${RELOCATING-0} :
    375     {
    376       *(.rela.ifunc.*)
    377     }
    378 EOF
    379 fi
    380 
    381 cat >> ldscripts/dyntmp.$$ <<EOF
    382   .rel.plt      ${RELOCATING-0} : { *(.rel.plt) }
    383   .rela.plt     ${RELOCATING-0} : { *(.rela.plt) }
    384   ${OTHER_PLT_RELOC_SECTIONS}
    385 EOF
    386 
    387 if test -z "${NON_ALLOC_DYN}"; then
    388   if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
    389     cat ldscripts/dyntmp.$$
    390   else
    391     if test -z "${NO_REL_RELOCS}"; then
    392       sed -e '/^[ 	]*\.rela\.[^}]*$/,/}/d' -e '/^[ 	]*\.rela\./d' ldscripts/dyntmp.$$
    393     fi
    394     if test -z "${NO_RELA_RELOCS}"; then
    395       sed -e '/^[ 	]*\.rel\.[^}]*$/,/}/d' -e '/^[ 	]*\.rel\./d' ldscripts/dyntmp.$$
    396     fi
    397   fi
    398   rm -f ldscripts/dyntmp.$$
    399 fi
    400 
    401 cat <<EOF
    402   .init         ${RELOCATING-0} : 
    403   { 
    404     ${RELOCATING+${INIT_START}}
    405     KEEP (*(.init))
    406     ${RELOCATING+${INIT_END}}
    407   } =${NOP-0}
    408 
    409   ${TEXT_PLT+${PLT}}
    410   ${TINY_READONLY_SECTION}
    411   .text         ${RELOCATING-0} :
    412   {
    413     ${RELOCATING+${TEXT_START_SYMBOLS}}
    414     *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
    415     /* .gnu.warning sections are handled specially by elf32.em.  */
    416     *(.gnu.warning)
    417     ${RELOCATING+${OTHER_TEXT_SECTIONS}}
    418   } =${NOP-0}
    419   .fini         ${RELOCATING-0} :
    420   {
    421     ${RELOCATING+${FINI_START}}
    422     KEEP (*(.fini))
    423     ${RELOCATING+${FINI_END}}
    424   } =${NOP-0}
    425   ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
    426   ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
    427   ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
    428   ${WRITABLE_RODATA-${RODATA}}
    429   .rodata1      ${RELOCATING-0} : { *(.rodata1) }
    430   ${CREATE_SHLIB-${SDATA2}}
    431   ${CREATE_SHLIB-${SBSS2}}
    432   ${OTHER_READONLY_SECTIONS}
    433   .eh_frame_hdr : { *(.eh_frame_hdr) }
    434   .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
    435   .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
    436 
    437   /* Adjust the address for the data segment.  We want to adjust up to
    438      the same address within the page on the next page up.  */
    439   ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
    440   ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    441   ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
    442 
    443   /* Exception handling  */
    444   .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
    445   .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
    446 
    447   /* Thread Local Storage sections  */
    448   .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
    449 
    450   .preinit_array   ${RELOCATING-0} :
    451   {
    452     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}}
    453     KEEP (*(.preinit_array))
    454     ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}}
    455   }
    456   ${RELOCATING+${INIT_ARRAY}}
    457   ${RELOCATING+${FINI_ARRAY}}
    458   ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
    459   ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
    460   .jcr          ${RELOCATING-0} : { KEEP (*(.jcr)) }
    461 
    462   ${RELOCATING+${DATARELRO}}
    463   ${OTHER_RELRO_SECTIONS}
    464   ${TEXT_DYNAMIC-${DYNAMIC}}
    465   ${DATA_GOT+${RELRO_NOW+${GOT}}}
    466   ${DATA_GOT+${RELRO_NOW+${GOTPLT}}}
    467   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${GOT}}}}
    468   ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
    469   ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${GOT}}}}
    470   ${DATA_GOT+${RELRO_NOW-${GOTPLT}}}
    471 
    472   ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
    473 
    474   .data         ${RELOCATING-0} :
    475   {
    476     ${RELOCATING+${DATA_START_SYMBOLS}}
    477     *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
    478     ${CONSTRUCTING+SORT(CONSTRUCTORS)}
    479   }
    480   .data1        ${RELOCATING-0} : { *(.data1) }
    481   ${WRITABLE_RODATA+${RODATA}}
    482   ${OTHER_READWRITE_SECTIONS}
    483   ${SMALL_DATA_CTOR+${RELOCATING+${CTOR}}}
    484   ${SMALL_DATA_DTOR+${RELOCATING+${DTOR}}}
    485   ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
    486   ${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}
    487   ${SDATA_GOT+${GOT}}
    488   ${SDATA_GOT+${OTHER_GOT_SECTIONS}}
    489   ${SDATA}
    490   ${OTHER_SDATA_SECTIONS}
    491   ${RELOCATING+${DATA_END_SYMBOLS-${USER_LABEL_PREFIX}_edata = .; PROVIDE (${USER_LABEL_PREFIX}edata = .);}}
    492   ${RELOCATING+__bss_start = .;}
    493   ${RELOCATING+${OTHER_BSS_SYMBOLS}}
    494   ${SBSS}
    495   ${BSS_PLT+${PLT}}
    496   .bss          ${RELOCATING-0} :
    497   {
    498    *(.dynbss)
    499    *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
    500    *(COMMON)
    501    /* Align here to ensure that the .bss section occupies space up to
    502       _end.  Align after .bss to ensure correct alignment even if the
    503       .bss section disappears because there are no input sections.
    504       FIXME: Why do we need it? When there is no .bss section, we don't
    505       pad the .data section.  */
    506    ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
    507   }
    508   ${OTHER_BSS_SECTIONS}
    509   ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
    510   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    511   ${LARGE_SECTIONS}
    512   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
    513   ${RELOCATING+${OTHER_END_SYMBOLS}}
    514   ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; PROVIDE (${USER_LABEL_PREFIX}end = .);}}
    515   ${RELOCATING+${DATA_SEGMENT_END}}
    516 EOF
    517 
    518 if test -n "${NON_ALLOC_DYN}"; then
    519   if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
    520     cat ldscripts/dyntmp.$$
    521   else
    522     if test -z "${NO_REL_RELOCS}"; then
    523       sed -e '/^[ 	]*\.rela\.[^}]*$/,/}/d' -e '/^[ 	]*\.rela\./d' ldscripts/dyntmp.$$
    524     fi
    525     if test -z "${NO_RELA_RELOCS}"; then
    526       sed -e '/^[ 	]*\.rel\.[^}]*$/,/}/d' -e '/^[ 	]*\.rel\./d' ldscripts/dyntmp.$$
    527     fi
    528   fi
    529   rm -f ldscripts/dyntmp.$$
    530 fi
    531 
    532 cat <<EOF
    533   /* Stabs debugging sections.  */
    534   .stab          0 : { *(.stab) }
    535   .stabstr       0 : { *(.stabstr) }
    536   .stab.excl     0 : { *(.stab.excl) }
    537   .stab.exclstr  0 : { *(.stab.exclstr) }
    538   .stab.index    0 : { *(.stab.index) }
    539   .stab.indexstr 0 : { *(.stab.indexstr) }
    540 
    541   .comment       0 : { *(.comment) }
    542 
    543 EOF
    544 
    545 . $srcdir/scripttempl/DWARF.sc
    546 
    547 cat <<EOF
    548   ${TINY_DATA_SECTION}
    549   ${TINY_BSS_SECTION}
    550 
    551   ${STACK_ADDR+${STACK}}
    552   ${ATTRS_SECTIONS}
    553   ${OTHER_SECTIONS}
    554   ${RELOCATING+${OTHER_SYMBOLS}}
    555   ${RELOCATING+${DISCARDED}}
    556 }
    557 EOF
    558