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