xref: /freebsd/sys/conf/ldscript.amd64 (revision 586f63035fbe5e45cfc971037fd76375661ece26)
1/* $FreeBSD$ */
2OUTPUT_FORMAT("elf64-x86-64-freebsd", "elf64-x86-64-freebsd", "elf64-x86-64-freebsd")
3OUTPUT_ARCH(i386:x86-64)
4ENTRY(btext)
5SEARCH_DIR("/usr/lib");
6SECTIONS
7{
8  /* Read-only sections, merged into text segment: */
9  kernphys = CONSTANT (MAXPAGESIZE);
10  . = kernbase + kernphys + SIZEOF_HEADERS;
11  .interp         : { *(.interp) }
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  .rel.init       : { *(.rel.init) }
20  .rela.init      : { *(.rela.init) }
21  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
22  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
23  .rel.fini       : { *(.rel.fini) }
24  .rela.fini      : { *(.rela.fini) }
25  .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
26  .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
27  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
28  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
29  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
30  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
31  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
32  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
33  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
34  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
35  .rel.ctors      : { *(.rel.ctors) }
36  .rela.ctors     : { *(.rela.ctors) }
37  .rel.dtors      : { *(.rel.dtors) }
38  .rela.dtors     : { *(.rela.dtors) }
39  .rel.got        : { *(.rel.got) }
40  .rela.got       : { *(.rela.got) }
41  .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
42  .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
43  .rel.ldata      : { *(.rel.ldata .rel.ldata.* .rel.gnu.linkonce.l.*) }
44  .rela.ldata     : { *(.rela.ldata .rela.ldata.* .rela.gnu.linkonce.l.*) }
45  .rel.lbss       : { *(.rel.lbss .rel.lbss.* .rel.gnu.linkonce.lb.*) }
46  .rela.lbss      : { *(.rela.lbss .rela.lbss.* .rela.gnu.linkonce.lb.*) }
47  .rel.lrodata    : { *(.rel.lrodata .rel.lrodata.* .rel.gnu.linkonce.lr.*) }
48  .rela.lrodata   : { *(.rela.lrodata .rela.lrodata.* .rela.gnu.linkonce.lr.*) }
49  .rel.plt        : { *(.rel.plt) }
50  .rela.plt       : { *(.rela.plt) }
51  .init           :
52  {
53    KEEP (*(.init))
54  } =0x90909090
55  .plt            : { *(.plt) }
56  .text           :
57  {
58    *(.text .stub .text.* .gnu.linkonce.t.*)
59    KEEP (*(.text.*personality*))
60    /* .gnu.warning sections are handled specially by elf32.em.  */
61    *(.gnu.warning)
62  } =0x90909090
63  .fini           :
64  {
65    KEEP (*(.fini))
66  } =0x90909090
67  PROVIDE (__etext = .);
68  PROVIDE (_etext = .);
69  PROVIDE (etext = .);
70  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
71  .rodata1        : { *(.rodata1) }
72  .eh_frame_hdr : { *(.eh_frame_hdr) }
73  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
74  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
75  /* Adjust the address for the data segment.  We want to adjust up to
76     the same address within the page on the next page up.  */
77  . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = 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  /* Thread Local Storage sections  */
82  .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
83  .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
84  .preinit_array     :
85  {
86    PROVIDE_HIDDEN (__preinit_array_start = .);
87    KEEP (*(.preinit_array))
88    PROVIDE_HIDDEN (__preinit_array_end = .);
89  }
90  .init_array     :
91  {
92     PROVIDE_HIDDEN (__init_array_start = .);
93     KEEP (*(SORT(.init_array.*)))
94     KEEP (*(.init_array))
95     PROVIDE_HIDDEN (__init_array_end = .);
96  }
97  .fini_array     :
98  {
99    PROVIDE_HIDDEN (__fini_array_start = .);
100    KEEP (*(.fini_array))
101    KEEP (*(SORT(.fini_array.*)))
102    PROVIDE_HIDDEN (__fini_array_end = .);
103  }
104  _start_ctors = .;
105  PROVIDE (start_ctors = .);
106  .ctors          :
107  {
108    /* gcc uses crtbegin.o to find the start of
109       the constructors, so we make sure it is
110       first.  Because this is a wildcard, it
111       doesn't matter if the user does not
112       actually link against crtbegin.o; the
113       linker won't look for a file to match a
114       wildcard.  The wildcard also means that it
115       doesn't matter which directory crtbegin.o
116       is in.  */
117    KEEP (*crtbegin.o(.ctors))
118    KEEP (*crtbegin?.o(.ctors))
119    /* We don't want to include the .ctor section from
120       the crtend.o file until after the sorted ctors.
121       The .ctor section from the crtend file contains the
122       end of ctors marker and it must be last */
123    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
124    KEEP (*(SORT(.ctors.*)))
125    KEEP (*(.ctors))
126  }
127  _stop_ctors = .;
128  PROVIDE (stop_ctors = .);
129  .dtors          :
130  {
131    KEEP (*crtbegin.o(.dtors))
132    KEEP (*crtbegin?.o(.dtors))
133    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
134    KEEP (*(SORT(.dtors.*)))
135    KEEP (*(.dtors))
136  }
137  .jcr            : { KEEP (*(.jcr)) }
138  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
139  .dynamic        : { *(.dynamic) }
140  .got            : { *(.got) }
141  . = DATA_SEGMENT_RELRO_END (24, .);
142  .got.plt        : { *(.got.plt) }
143  .data           :
144  {
145    *(.data .data.* .gnu.linkonce.d.*)
146    KEEP (*(.gnu.linkonce.d.*personality*))
147    SORT(CONSTRUCTORS)
148  }
149  .data1          : { *(.data1) }
150  _edata = .; PROVIDE (edata = .);
151  __bss_start = .;
152  .bss            :
153  {
154   *(.dynbss)
155   *(.bss .bss.* .gnu.linkonce.b.*)
156   *(COMMON)
157   /* Align here to ensure that the .bss section occupies space up to
158      _end.  Align after .bss to ensure correct alignment even if the
159      .bss section disappears because there are no input sections.
160      FIXME: Why do we need it? When there is no .bss section, we don't
161      pad the .data section.  */
162   . = ALIGN(. != 0 ? 64 / 8 : 1);
163  }
164  .lbss   :
165  {
166    *(.dynlbss)
167    *(.lbss .lbss.* .gnu.linkonce.lb.*)
168    *(LARGE_COMMON)
169  }
170  . = ALIGN(64 / 8);
171  .lrodata   ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
172  {
173    *(.lrodata .lrodata.* .gnu.linkonce.lr.*)
174  }
175  .ldata   ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) :
176  {
177    *(.ldata .ldata.* .gnu.linkonce.l.*)
178    . = ALIGN(. != 0 ? 64 / 8 : 1);
179  }
180  . = ALIGN(64 / 8);
181  _end = .; PROVIDE (end = .);
182  . = DATA_SEGMENT_END (.);
183  /* Stabs debugging sections.  */
184  .stab          0 : { *(.stab) }
185  .stabstr       0 : { *(.stabstr) }
186  .stab.excl     0 : { *(.stab.excl) }
187  .stab.exclstr  0 : { *(.stab.exclstr) }
188  .stab.index    0 : { *(.stab.index) }
189  .stab.indexstr 0 : { *(.stab.indexstr) }
190  .comment       0 : { *(.comment) }
191  /* DWARF debug sections.
192     Symbols in the DWARF debugging sections are relative to the beginning
193     of the section so we begin them at 0.  */
194  /* DWARF 1 */
195  .debug          0 : { *(.debug) }
196  .line           0 : { *(.line) }
197  /* GNU DWARF 1 extensions */
198  .debug_srcinfo  0 : { *(.debug_srcinfo) }
199  .debug_sfnames  0 : { *(.debug_sfnames) }
200  /* DWARF 1.1 and DWARF 2 */
201  .debug_aranges  0 : { *(.debug_aranges) }
202  .debug_pubnames 0 : { *(.debug_pubnames) }
203  /* DWARF 2 */
204  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
205  .debug_abbrev   0 : { *(.debug_abbrev) }
206  .debug_line     0 : { *(.debug_line) }
207  .debug_frame    0 : { *(.debug_frame) }
208  .debug_str      0 : { *(.debug_str) }
209  .debug_loc      0 : { *(.debug_loc) }
210  .debug_macinfo  0 : { *(.debug_macinfo) }
211  /* SGI/MIPS DWARF 2 extensions */
212  .debug_weaknames 0 : { *(.debug_weaknames) }
213  .debug_funcnames 0 : { *(.debug_funcnames) }
214  .debug_typenames 0 : { *(.debug_typenames) }
215  .debug_varnames  0 : { *(.debug_varnames) }
216  /* DWARF 3 */
217  .debug_pubtypes 0 : { *(.debug_pubtypes) }
218  .debug_ranges   0 : { *(.debug_ranges) }
219  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
220  /DISCARD/ : { *(.note.GNU-stack) }
221}
222