1/* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */
2OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
3	      "elf64-x86-64")
4OUTPUT_ARCH(i386:x86-64)
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.plt) *(.igot.plt) *(.got) *(.igot) }
147  . = DATA_SEGMENT_RELRO_END (0, .);
148  .data           :
149  {
150    *(.data .data.* .gnu.linkonce.d.*)
151    SORT(CONSTRUCTORS)
152  }
153  .data1          : { *(.data1) }
154  _edata = .; PROVIDE (edata = .);
155  . = .;
156  __bss_start = .;
157  .bss            :
158  {
159   *(.dynbss)
160   *(.bss .bss.* .gnu.linkonce.b.*)
161   *(COMMON)
162   /* Align here to ensure that the .bss section occupies space up to
163      _end.  Align after .bss to ensure correct alignment even if the
164      .bss section disappears because there are no input sections.  */
165   . = ALIGN(64 / 8);
166  }
167  .lbss   :
168  {
169    *(.dynlbss)
170    *(.lbss .lbss.* .gnu.linkonce.lb.*)
171    *(LARGE_COMMON)
172  }
173  . = ALIGN(64 / 8);
174  .lrodata   ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
175  {
176    *(.lrodata .lrodata.* .gnu.linkonce.lr.*)
177  }
178  .ldata   ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
179  {
180    *(.ldata .ldata.* .gnu.linkonce.l.*)
181    . = ALIGN(. != 0 ? 64 / 8 : 1);
182  }
183  . = ALIGN(64 / 8);
184  _end = .;
185  _bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
186  PROVIDE (end = .);
187  . = DATA_SEGMENT_END (.);
188  /* Stabs debugging sections.  */
189  .stab          0 : { *(.stab) }
190  .stabstr       0 : { *(.stabstr) }
191  .stab.excl     0 : { *(.stab.excl) }
192  .stab.exclstr  0 : { *(.stab.exclstr) }
193  .stab.index    0 : { *(.stab.index) }
194  .stab.indexstr 0 : { *(.stab.indexstr) }
195  .comment       0 : { *(.comment) }
196  /* DWARF debug sections.
197     Symbols in the DWARF debugging sections are relative to the beginning
198     of the section so we begin them at 0.  */
199  /* DWARF 1 */
200  .debug          0 : { *(.debug) }
201  .line           0 : { *(.line) }
202  /* GNU DWARF 1 extensions */
203  .debug_srcinfo  0 : { *(.debug_srcinfo) }
204  .debug_sfnames  0 : { *(.debug_sfnames) }
205  /* DWARF 1.1 and DWARF 2 */
206  .debug_aranges  0 : { *(.debug_aranges) }
207  .debug_pubnames 0 : { *(.debug_pubnames) }
208  /* DWARF 2 */
209  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
210  .debug_abbrev   0 : { *(.debug_abbrev) }
211  .debug_line     0 : { *(.debug_line) }
212  .debug_frame    0 : { *(.debug_frame) }
213  .debug_str      0 : { *(.debug_str) }
214  .debug_loc      0 : { *(.debug_loc) }
215  .debug_macinfo  0 : { *(.debug_macinfo) }
216  /* SGI/MIPS DWARF 2 extensions */
217  .debug_weaknames 0 : { *(.debug_weaknames) }
218  .debug_funcnames 0 : { *(.debug_funcnames) }
219  .debug_typenames 0 : { *(.debug_typenames) }
220  .debug_varnames  0 : { *(.debug_varnames) }
221  /* DWARF 3 */
222  .debug_pubtypes 0 : { *(.debug_pubtypes) }
223  .debug_ranges   0 : { *(.debug_ranges) }
224  /* DWARF Extension.  */
225  .debug_macro    0 : { *(.debug_macro) }
226  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
227  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.mdebug.*) }
228}
229