1# This variant of elf.sc is used for ARM BPABI platforms, like Symbian
2# OS, where a separate postlinker will operated on the generated
3# executable or shared object.  See elf.sc for configuration variables
4# that apply; only BPABI-specific variables will be noted here.
5#
6# Copyright (C) 2014-2016 Free Software Foundation, Inc.
7#
8# Copying and distribution of this file, with or without modification,
9# are permitted in any medium without royalty provided the copyright
10# notice and this notice are preserved.
11
12test -z "$ENTRY" && ENTRY=_start
13test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
14test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
15if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
16test -z "${ELFSIZE}" && ELFSIZE=32
17test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
18test "$LD_FLAG" = "N" && DATA_ADDR=.
19test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
20test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
21test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
22DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
23DATA_SEGMENT_RELRO_END=""
24DATA_SEGMENT_RELRO_GOTPLT_END=""
25DATA_SEGMENT_END=""
26if test -n "${COMMONPAGESIZE}"; then
27  DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
28  DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
29  if test -n "${SEPARATE_GOTPLT}"; then
30    DATA_SEGMENT_RELRO_GOTPLT_END=". = DATA_SEGMENT_RELRO_END (. + ${SEPARATE_GOTPLT});"
31  else
32    DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (.);"
33  fi
34fi
35INTERP=".interp       0 : { *(.interp) }"
36PLT=".plt          ${RELOCATING-0} : { *(.plt) }"
37RODATA=".rodata       ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }"
38DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }"
39DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink)  *(.gnu.lto_*) }"
40if test -z "${NO_SMALL_DATA}"; then
41  SBSS=".sbss         ${RELOCATING-0} :
42  {
43    ${RELOCATING+PROVIDE (__sbss_start = .);}
44    ${RELOCATING+PROVIDE (___sbss_start = .);}
45    *(.dynsbss)
46    *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
47    *(.scommon)
48    ${RELOCATING+PROVIDE (__sbss_end = .);}
49    ${RELOCATING+PROVIDE (___sbss_end = .);}
50  }"
51  SBSS2=".sbss2        ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
52  SDATA="/* We want the small data sections together, so single-instruction offsets
53     can access them all, and initialized data all before uninitialized, so
54     we can shorten the on-disk segment size.  */
55  .sdata        ${RELOCATING-0} :
56  {
57    ${RELOCATING+${SDATA_START_SYMBOLS}}
58    *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
59  }"
60  SDATA2=".sdata2       ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }"
61  REL_SDATA=".rel.sdata    ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
62  .rela.sdata   ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
63  REL_SBSS=".rel.sbss     ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
64  .rela.sbss    ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
65  REL_SDATA2=".rel.sdata2   ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
66  .rela.sdata2  ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
67  REL_SBSS2=".rel.sbss2    ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
68  .rela.sbss2   ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
69else
70  NO_SMALL_DATA=" "
71fi
72test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
73INIT_ARRAY=".init_array   ${RELOCATING-0} :
74  {
75    /* SymbianOS uses this symbol.  */
76    ${RELOCATING+PROVIDE (SHT\$\$INIT_ARRAY\$\$Base = .);}
77    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_start = .);}}
78    KEEP (*(SORT(.init_array.*)))
79    KEEP (*(.init_array))
80    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__init_array_end = .);}}
81    /* SymbianOS uses this symbol.  */
82    ${RELOCATING+PROVIDE (SHT\$\$INIT_ARRAY\$\$Limit = .);}
83  }"
84FINI_ARRAY=".fini_array   ${RELOCATING-0} :
85  {
86    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_start = .);}}
87    KEEP (*(SORT(.fini_array.*)))
88    KEEP (*(.fini_array))
89    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__fini_array_end = .);}}
90  }"
91CTOR=".ctors        ${CONSTRUCTING-0} :
92  {
93    ${CONSTRUCTING+${CTOR_START}}
94    /* gcc uses crtbegin.o to find the start of
95       the constructors, so we make sure it is
96       first.  Because this is a wildcard, it
97       doesn't matter if the user does not
98       actually link against crtbegin.o; the
99       linker won't look for a file to match a
100       wildcard.  The wildcard also means that it
101       doesn't matter which directory crtbegin.o
102       is in.  */
103
104    KEEP (*crtbegin.o(.ctors))
105    KEEP (*crtbegin?.o(.ctors))
106
107    /* We don't want to include the .ctor section from
108       the crtend.o file until after the sorted ctors.
109       The .ctor section from the crtend file contains the
110       end of ctors marker and it must be last */
111
112    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
113    KEEP (*(SORT(.ctors.*)))
114    KEEP (*(.ctors))
115    ${CONSTRUCTING+${CTOR_END}}
116  }"
117DTOR=".dtors        ${CONSTRUCTING-0} :
118  {
119    ${CONSTRUCTING+${DTOR_START}}
120    KEEP (*crtbegin.o(.dtors))
121    KEEP (*crtbegin?.o(.dtors))
122    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
123    KEEP (*(SORT(.dtors.*)))
124    KEEP (*(.dtors))
125    ${CONSTRUCTING+${DTOR_END}}
126  }"
127STACK="  .stack        ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
128  {
129    ${RELOCATING+_stack = .;}
130    *(.stack)
131  }"
132
133TEXT_START_ADDR="SEGMENT_START(\"text\", ${TEXT_START_ADDR})"
134SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text\", ${SHLIB_TEXT_START_ADDR:-0})"
135DATA_ADDR="SEGMENT_START(\"data\", ${DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
136SHLIB_DATA_ADDR="SEGMENT_START(\"data\", ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}})"
137
138# If this is for an embedded system, don't add SIZEOF_HEADERS.
139if [ -z "$EMBEDDED" ]; then
140   test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
141   SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR} + SIZEOF_HEADERS"
142else
143   test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
144   SHLIB_BASE_ADDRESS="${SHLIB_TEXT_START_ADDR}"
145fi
146
147cat <<EOF
148/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
149
150   Copying and distribution of this script, with or without modification,
151   are permitted in any medium without royalty provided the copyright
152   notice and this notice are preserved.  */
153
154OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
155	      "${LITTLE_OUTPUT_FORMAT}")
156OUTPUT_ARCH(${OUTPUT_ARCH})
157${RELOCATING+ENTRY(${ENTRY})}
158
159${RELOCATING+${LIB_SEARCH_DIRS}}
160${RELOCATING+/* Do we need any of these for elf?
161   __DYNAMIC = 0; ${STACKZERO+${STACKZERO}} ${SHLIB_PATH+${SHLIB_PATH}}  */}
162${RELOCATING+${EXECUTABLE_SYMBOLS}}
163${RELOCATING+${INPUT_FILES}}
164${RELOCATING- /* For some reason, the Solaris linker makes bad executables
165  if gld -r is used and the intermediate file has sections starting
166  at non-zero addresses.  Could be a Solaris ld bug, could be a GNU ld
167  bug.  But for now assigning the zero vmas works.  */}
168
169/* ARM's proprietary toolchain generate these symbols to match the start
170   and end of particular sections of the image.  SymbianOS uses these
171   symbols.  We provide them for compatibility with ARM's toolchains.
172   These symbols should be bound locally; each shared object may define
173   its own version of these symbols.  */
174
175VERSION
176{
177  /* Give these a dummy version to work around linker lameness.
178     The name used shouldn't matter as these are all local symbols.  */
179  __GNU {
180    local:
181      Image\$\$ER_RO\$\$Base;
182      Image\$\$ER_RO\$\$Limit;
183      SHT\$\$INIT_ARRAY\$\$Base;
184      SHT\$\$INIT_ARRAY\$\$Limit;
185      .ARM.exidx\$\$Base;
186      .ARM.exidx\$\$Limit;
187  };
188}
189
190SECTIONS
191{
192  /* Read-only sections, merged into text segment: */
193  ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR});}}}
194
195  ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+ . = ${TEXT_BASE_ADDRESS};}}}
196  ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
197  ${CREATE_PIE+${RELOCATING+. = ${SHLIB_BASE_ADDRESS};}}
198
199  /* Define Image\$\$ER_RO\$\$Base.  */
200  ${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Base = .);}
201
202  ${INITIAL_READONLY_SECTIONS}
203
204EOF
205cat <<EOF
206  .init         ${RELOCATING-0} :
207  {
208    ${RELOCATING+${INIT_START}}
209    KEEP (*(.init))
210    ${RELOCATING+${INIT_END}}
211  } =${NOP-0}
212  .text         ${RELOCATING-0} :
213  {
214    ${RELOCATING+${TEXT_START_SYMBOLS}}
215    *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
216    /* .gnu.warning sections are handled specially by elf32.em.  */
217    *(.gnu.warning)
218    ${RELOCATING+${OTHER_TEXT_SECTIONS}}
219  } =${NOP-0}
220  .fini         ${RELOCATING-0} :
221  {
222    ${RELOCATING+${FINI_START}}
223    KEEP (*(.fini))
224    ${RELOCATING+${FINI_END}}
225  } =${NOP-0}
226  /* The SymbianOS kernel requires that the PLT go at the end of the
227     text section.  */
228  ${DATA_PLT-${BSS_PLT-${PLT}}}
229  ${RELOCATING+PROVIDE (__etext = .);}
230  ${RELOCATING+PROVIDE (_etext = .);}
231  ${RELOCATING+PROVIDE (etext = .);}
232
233  /* Define Image\$\$ER_RO\$\$Limit.  */
234  ${RELOCATING+PROVIDE (Image\$\$ER_RO\$\$Limit = .);}
235
236  ${WRITABLE_RODATA-${RODATA}}
237  .rodata1      ${RELOCATING-0} : { *(.rodata1) }
238  ${CREATE_SHLIB-${SDATA2}}
239  ${CREATE_SHLIB-${SBSS2}}
240
241  /* On SymbianOS, put  .init_array and friends in the read-only
242     segment; there is no runtime relocation applied to these
243     arrays.  */
244
245  .preinit_array   ${RELOCATING-0} :
246  {
247    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_start = .);}}
248    KEEP (*(.preinit_array))
249    ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (__preinit_array_end = .);}}
250  }
251  ${RELOCATING+${INIT_ARRAY}}
252  ${RELOCATING+${FINI_ARRAY}}
253
254  ${OTHER_READONLY_SECTIONS}
255  .eh_frame_hdr : { *(.eh_frame_hdr) }
256  .eh_frame     ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
257  .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
258
259  /* Adjust the address for the data segment.  We want to adjust up to
260     the same address within the page on the next page up.  */
261  ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR};}}}
262  ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
263  ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR};}}
264
265  /* Exception handling  */
266  .eh_frame     ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
267  .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) }
268
269  /* Thread Local Storage sections  */
270  .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
271  .tbss		${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
272
273  ${RELOCATING+${CTOR}}
274  ${RELOCATING+${DTOR}}
275  .jcr          ${RELOCATING-0} : { KEEP (*(.jcr)) }
276
277  ${RELOCATING+${DATARELRO}}
278  ${OTHER_RELRO_SECTIONS}
279  ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
280
281  ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
282
283  .data         ${RELOCATING-0} :
284  {
285    ${RELOCATING+${DATA_START_SYMBOLS}}
286    *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
287    ${CONSTRUCTING+SORT(CONSTRUCTORS)}
288  }
289  .data1        ${RELOCATING-0} : { *(.data1) }
290  ${WRITABLE_RODATA+${RODATA}}
291  ${OTHER_READWRITE_SECTIONS}
292  ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
293  ${CREATE_SHLIB+${SDATA2}}
294  ${CREATE_SHLIB+${SBSS2}}
295  ${SDATA}
296  ${OTHER_SDATA_SECTIONS}
297  ${RELOCATING+_edata = .;}
298  ${RELOCATING+PROVIDE (edata = .);}
299  ${RELOCATING+. = DEFINED(__bss_segment_start) ? __bss_segment_start : .;}
300  ${RELOCATING+__bss_start = .;}
301  ${RELOCATING+${OTHER_BSS_SYMBOLS}}
302  ${SBSS}
303  ${BSS_PLT+${PLT}}
304  .bss          ${RELOCATING-0} :
305  {
306   *(.dynbss)
307   *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
308   *(COMMON)
309   /* Align here to ensure that the .bss section occupies space up to
310      _end.  Align after .bss to ensure correct alignment even if the
311      .bss section disappears because there are no input sections.  */
312   ${RELOCATING+. = ALIGN(${ALIGNMENT});}
313  }
314  ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
315  ${RELOCATING+. = ALIGN(${ALIGNMENT});}
316  ${RELOCATING+${OTHER_END_SYMBOLS}}
317  ${RELOCATING+_end = .;}
318  ${RELOCATING+PROVIDE (end = .);}
319  ${RELOCATING+${DATA_SEGMENT_END}}
320
321  /* These sections are not mapped under the BPABI.  */
322  .dynamic      0 : { *(.dynamic) }
323  .hash         0 : { *(.hash) }
324  .dynsym       0 : { *(.dynsym) }
325  .dynstr       0 : { *(.dynstr) }
326  .gnu.version  0 : { *(.gnu.version) }
327  .gnu.version_d 0: { *(.gnu.version_d) }
328  .gnu.version_r 0: { *(.gnu.version_r) }
329  ${CREATE_SHLIB-${INTERP}}
330
331  /* Stabs debugging sections.  */
332  .stab          0 : { *(.stab) }
333  .stabstr       0 : { *(.stabstr) }
334  .stab.excl     0 : { *(.stab.excl) }
335  .stab.exclstr  0 : { *(.stab.exclstr) }
336  .stab.index    0 : { *(.stab.index) }
337  .stab.indexstr 0 : { *(.stab.indexstr) }
338
339  .comment       0 : { *(.comment) }
340EOF
341
342. $srcdir/scripttempl/DWARF.sc
343
344cat <<EOF
345  ${STACK_ADDR+${STACK}}
346  ${OTHER_SECTIONS}
347  ${RELOCATING+${OTHER_SYMBOLS}}
348  ${RELOCATING+${DISCARDED}}
349EOF
350
351# These relocations sections are part of the read-only segment in SVR4
352# executables, but are not mapped in BPABI executables.
353if [ "x$COMBRELOC" = x ]; then
354  COMBRELOCCAT=cat
355else
356  COMBRELOCCAT="cat > $COMBRELOC"
357fi
358eval $COMBRELOCCAT <<EOF
359  .rel.init     0 : { *(.rel.init) }
360  .rela.init    0 : { *(.rela.init) }
361  .rel.text     0 : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
362  .rela.text    0 : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
363  .rel.fini     0 : { *(.rel.fini) }
364  .rela.fini    0 : { *(.rela.fini) }
365  .rel.rodata   0 : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
366  .rela.rodata  0 : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
367  ${OTHER_READONLY_RELOC_SECTIONS}
368  .rel.data.rel.ro 0 : { *(.rel.data.rel.ro${RELOCATING+ .rel.data.rel.ro.*}) }
369  .rela.data.rel.ro 0 : { *(.rela.data.rel.ro${RELOCATING+ .rela.data.rel.ro.*}) }
370  .rel.data     0 : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
371  .rela.data    0 : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
372  .rel.tdata	0 : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
373  .rela.tdata	0 : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
374  .rel.tbss	0 : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
375  .rela.tbss	0 : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
376  .rel.ctors    0 : { *(.rel.ctors) }
377  .rela.ctors   0 : { *(.rela.ctors) }
378  .rel.dtors    0 : { *(.rel.dtors) }
379  .rela.dtors   0 : { *(.rela.dtors) }
380  ${REL_SDATA}
381  ${REL_SBSS}
382  ${REL_SDATA2}
383  ${REL_SBSS2}
384  .rel.bss      0 : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
385  .rela.bss     0 : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
386  .rel.init_array  0 : { *(.rel.init_array) }
387  .rela.init_array 0 : { *(.rela.init_array) }
388  .rel.fini_array  0 : { *(.rel.fini_array) }
389  .rela.fini_array 0 : { *(.rela.fini_array) }
390EOF
391if [ -n "$COMBRELOC" ]; then
392cat <<EOF
393  .rel.dyn      0 :
394    {
395EOF
396sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/      \1/' $COMBRELOC
397cat <<EOF
398    }
399  .rela.dyn     0 :
400    {
401EOF
402sed -e '/^[ 	]*[{}][ 	]*$/d;/:[ 	]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/      \1/' $COMBRELOC
403cat <<EOF
404    }
405EOF
406fi
407cat <<EOF
408  .rel.plt      0 : { *(.rel.plt) }
409  .rela.plt     0 : { *(.rela.plt) }
410  ${OTHER_PLT_RELOC_SECTIONS}
411  .rel.other    0 : { *(.rel.*) }
412  .rela.other   0 : { *(.rela.*) }
413  .reli.other   0 : { *(.reli.*) }
414}
415EOF
416