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