1/* Script for -z combreloc: combine and sort reloc sections */
2OUTPUT_FORMAT("elf32-littlearm-fdpic", "elf32-bigarm-fdpic",
3	      "elf32-littlearm-fdpic")
4OUTPUT_ARCH(arm)
5ENTRY(_start)
6SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
7SECTIONS
8{
9  /* Read-only sections, merged into text segment: */
10  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x00008000)); . = SEGMENT_START("text-segment", 0x00008000) + SIZEOF_HEADERS;
11  .interp         : { *(.interp) }
12  .note.gnu.build-id : { *(.note.gnu.build-id) }
13  .hash           : { *(.hash) }
14  .gnu.hash       : { *(.gnu.hash) }
15  .dynsym         : { *(.dynsym) }
16  .dynstr         : { *(.dynstr) }
17  .gnu.version    : { *(.gnu.version) }
18  .gnu.version_d  : { *(.gnu.version_d) }
19  .gnu.version_r  : { *(.gnu.version_r) }
20  .rel.dyn        :
21    {
22      *(.rel.init)
23      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
24      *(.rel.fini)
25      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
26      *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
27      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
28      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
29      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
30      *(.rel.ctors)
31      *(.rel.dtors)
32      *(.rel.got)
33      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
34      PROVIDE_HIDDEN (__rel_iplt_start = .);
35      *(.rel.iplt)
36      PROVIDE_HIDDEN (__rel_iplt_end = .);
37      PROVIDE_HIDDEN (__rela_iplt_start = .);
38      PROVIDE_HIDDEN (__rela_iplt_end = .);
39    }
40  .rela.dyn       :
41    {
42      *(.rela.init)
43      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
44      *(.rela.fini)
45      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
46      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
47      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
48      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
49      *(.rela.ctors)
50      *(.rela.dtors)
51      *(.rela.got)
52      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
53      PROVIDE_HIDDEN (__rel_iplt_start = .);
54      PROVIDE_HIDDEN (__rel_iplt_end = .);
55      PROVIDE_HIDDEN (__rela_iplt_start = .);
56      *(.rela.iplt)
57      PROVIDE_HIDDEN (__rela_iplt_end = .);
58    }
59  .rel.plt        :
60    {
61      *(.rel.plt)
62    }
63  .rela.plt       :
64    {
65      *(.rela.plt)
66    }
67  .init           :
68  {
69    KEEP (*(.init))
70  } =0
71  .plt            : { *(.plt) }
72  .iplt           : { *(.iplt) }
73  .text           :
74  {
75    *(.text.unlikely .text.*_unlikely)
76    *(.text.exit .text.exit.*)
77    *(.text.startup .text.startup.*)
78    *(.text.hot .text.hot.*)
79    *(SORT(.text.sorted.*))
80    *(.text .stub .text.* .gnu.linkonce.t.*)
81    /* .gnu.warning sections are handled specially by elf.em.  */
82    *(.gnu.warning)
83    *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
84  } =0
85  .fini           :
86  {
87    KEEP (*(.fini))
88  } =0
89  PROVIDE (__etext = .);
90  PROVIDE (_etext = .);
91  PROVIDE (etext = .);
92  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
93  .rodata1        : { *(.rodata1) }
94  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
95   PROVIDE_HIDDEN (__exidx_start = .);
96  .ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
97   PROVIDE_HIDDEN (__exidx_end = .);
98  .rofixup : {
99	__ROFIXUP_LIST__ = .;
100	*(.rofixup)
101	__ROFIXUP_END__ = .;
102}
103  .eh_frame_hdr : { *(.eh_frame_hdr) }
104  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
105  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table
106  .gcc_except_table.*) }
107  /* These sections are generated by the Sun/Oracle C++ compiler.  */
108  .exception_ranges   : ONLY_IF_RO { *(.exception_ranges
109  .exception_ranges*) }
110  /* Adjust the address for the data segment.  We want to adjust up to
111     the same address within the page on the next page up.  */
112  . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
113  /* Exception handling  */
114  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
115  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
116  .exception_ranges   : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) }
117  /* Thread Local Storage sections  */
118  .tdata	  :
119   {
120     PROVIDE_HIDDEN (__tdata_start = .);
121     *(.tdata .tdata.* .gnu.linkonce.td.*)
122   }
123  .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
124  .preinit_array     :
125  {
126    PROVIDE_HIDDEN (__preinit_array_start = .);
127    KEEP (*(.preinit_array))
128    PROVIDE_HIDDEN (__preinit_array_end = .);
129  }
130  .init_array     :
131  {
132    PROVIDE_HIDDEN (__init_array_start = .);
133    KEEP (*(SORT(.init_array.*)))
134    KEEP (*(.init_array))
135    PROVIDE_HIDDEN (__init_array_end = .);
136  }
137  .fini_array     :
138  {
139    PROVIDE_HIDDEN (__fini_array_start = .);
140    KEEP (*(SORT(.fini_array.*)))
141    KEEP (*(.fini_array))
142    PROVIDE_HIDDEN (__fini_array_end = .);
143  }
144  .ctors          :
145  {
146    /* gcc uses crtbegin.o to find the start of
147       the constructors, so we make sure it is
148       first.  Because this is a wildcard, it
149       doesn't matter if the user does not
150       actually link against crtbegin.o; the
151       linker won't look for a file to match a
152       wildcard.  The wildcard also means that it
153       doesn't matter which directory crtbegin.o
154       is in.  */
155    KEEP (*crtbegin.o(.ctors))
156    KEEP (*crtbegin?.o(.ctors))
157    /* We don't want to include the .ctor section from
158       the crtend.o file until after the sorted ctors.
159       The .ctor section from the crtend file contains the
160       end of ctors marker and it must be last */
161    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
162    KEEP (*(SORT(.ctors.*)))
163    KEEP (*(.ctors))
164  }
165  .dtors          :
166  {
167    KEEP (*crtbegin.o(.dtors))
168    KEEP (*crtbegin?.o(.dtors))
169    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
170    KEEP (*(SORT(.dtors.*)))
171    KEEP (*(.dtors))
172  }
173  .jcr            : { KEEP (*(.jcr)) }
174  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
175  .dynamic        : { *(.dynamic) }
176  . = DATA_SEGMENT_RELRO_END (0, .);
177  .got            : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
178  .data           :
179  {
180    PROVIDE (__data_start = .);
181    *(.data .data.* .gnu.linkonce.d.*)
182    SORT(CONSTRUCTORS)
183  }
184  .data1          : { *(.data1) }
185  _edata = .; PROVIDE (edata = .);
186  __bss_start = .;
187  __bss_start__ = .;
188  .bss            :
189  {
190   *(.dynbss)
191   *(.bss .bss.* .gnu.linkonce.b.*)
192   *(COMMON)
193   /* Align here to ensure that the .bss section occupies space up to
194      _end.  Align after .bss to ensure correct alignment even if the
195      .bss section disappears because there are no input sections.
196      FIXME: Why do we need it? When there is no .bss section, we don't
197      pad the .data section.  */
198   . = ALIGN(. != 0 ? 32 / 8 : 1);
199  }
200  _bss_end__ = . ; __bss_end__ = . ;
201  . = ALIGN(32 / 8);
202  . = ALIGN(32 / 8);
203  __end__ = . ;
204  _end = .; PROVIDE (end = .);
205  . = DATA_SEGMENT_END (.);
206  /* Stabs debugging sections.  */
207  .stab          0 : { *(.stab) }
208  .stabstr       0 : { *(.stabstr) }
209  .stab.excl     0 : { *(.stab.excl) }
210  .stab.exclstr  0 : { *(.stab.exclstr) }
211  .stab.index    0 : { *(.stab.index) }
212  .stab.indexstr 0 : { *(.stab.indexstr) }
213  .comment       0 : { *(.comment) }
214  /* DWARF debug sections.
215     Symbols in the DWARF debugging sections are relative to the beginning
216     of the section so we begin them at 0.  */
217  /* DWARF 1 */
218  .debug          0 : { *(.debug) }
219  .line           0 : { *(.line) }
220  /* GNU DWARF 1 extensions */
221  .debug_srcinfo  0 : { *(.debug_srcinfo) }
222  .debug_sfnames  0 : { *(.debug_sfnames) }
223  /* DWARF 1.1 and DWARF 2 */
224  .debug_aranges  0 : { *(.debug_aranges) }
225  .debug_pubnames 0 : { *(.debug_pubnames) }
226  /* DWARF 2 */
227  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
228  .debug_abbrev   0 : { *(.debug_abbrev) }
229  .debug_line     0 : { *(.debug_line) }
230  .debug_frame    0 : { *(.debug_frame) }
231  .debug_str      0 : { *(.debug_str) }
232  .debug_loc      0 : { *(.debug_loc) }
233  .debug_macinfo  0 : { *(.debug_macinfo) }
234  /* SGI/MIPS DWARF 2 extensions */
235  .debug_weaknames 0 : { *(.debug_weaknames) }
236  .debug_funcnames 0 : { *(.debug_funcnames) }
237  .debug_typenames 0 : { *(.debug_typenames) }
238  .debug_varnames  0 : { *(.debug_varnames) }
239  /* DWARF 3 */
240  .debug_pubtypes 0 : { *(.debug_pubtypes) }
241  .debug_ranges   0 : { *(.debug_ranges) }
242  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
243  .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
244  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
245}
246