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