PR ld/20276: Set non_ir_ref on common symbol
[external/binutils.git] / ld / scripttempl / nds32elf.sc
1 # Copyright (C) 2014-2016 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-2016 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