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