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