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