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