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