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