Remove use of btr/bts instructions, which NaCl rejects
[glibc/nacl-glibc.git] / elf_i386.xs
blob4e000e9f747921f98f73d92c6126d7bfb4f115ed
1 /* Script for ld --shared: link shared library */
2 OUTPUT_FORMAT("elf32-nacl", "elf32-nacl",
3               "elf32-nacl")
4 OUTPUT_ARCH(i386)
5 ENTRY(_start)
6 SEARCH_DIR("/usr/i386-linux-gnu/lib32"); SEARCH_DIR("/usr/local/lib32"); SEARCH_DIR("/lib32"); SEARCH_DIR("/usr/lib32"); SEARCH_DIR("/usr/i386-linux-gnu/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
7 PHDRS
9   /* TODO: put headers in a separate, non-executable PT_LOAD segment. */
10   segheaders PT_LOAD FLAGS(4) FILEHDR PHDRS ;       /* read */
11   segtext    PT_LOAD FLAGS(5) ;       /* read + execute */
12   segrodata  PT_LOAD FLAGS(4) ;       /* read */
13   segdata    PT_LOAD FLAGS(6) ;       /* read + write */
14   dynamic    PT_DYNAMIC FLAGS(6) ;
15   stack      PT_GNU_STACK FLAGS(6) ;
16   tls        PT_TLS FLAGS(4) ;
17   /* TODO: do we need a stack? */
19 SECTIONS
21   /* Read-only sections, merged into text segment: */
22   _begin = 0x0;
23   . = 0x0 + SIZEOF_HEADERS;
24   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
25   .init           : SUBALIGN(32)
26   {
27     KEEP (*(.init))
28   } :segtext =0x90909090
29   .plt            : { *(.plt) }
30   .text           : SUBALIGN(32)
31   {
32     *(.text .stub .text.* .gnu.linkonce.t.*)
33     KEEP (*(.text.*personality*))
34     /* .gnu.warning sections are handled specially by elf32.em.  */
35     *(.gnu.warning)
36     /* Putting .fini here makes the align pad correctly when .fini is empty.
37        Listing the __libc* sections is also necessary to make padding work. */
38     KEEP (*(.fini))
39     *(__libc_freeres_fn)
40     *(__libc_thread_freeres_fn)
41     . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
42   } =0x90909090
43   PROVIDE (__etext = .);
44   PROVIDE (_etext = .);
45   PROVIDE (etext = .);
46   .note.gnu.build-id : { *(.note.gnu.build-id) } :segrodata
47   .hash           : { *(.hash) }
48   .gnu.hash       : { *(.gnu.hash) }
49   .dynsym         : { *(.dynsym) }
50   .dynstr         : { *(.dynstr) }
51   .gnu.version    : { *(.gnu.version) }
52   .gnu.version_d  : { *(.gnu.version_d) }
53   .gnu.version_r  : { *(.gnu.version_r) }
54   .rel.init       : { *(.rel.init) }
55   .rela.init      : { *(.rela.init) }
56   .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
57   .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
58   .rel.fini       : { *(.rel.fini) }
59   .rela.fini      : { *(.rela.fini) }
60   .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
61   .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
62   .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
63   .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
64   .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
65   .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
66   .rel.tdata      : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
67   .rela.tdata     : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
68   .rel.tbss       : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
69   .rela.tbss      : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
70   .rel.ctors      : { *(.rel.ctors) }
71   .rela.ctors     : { *(.rela.ctors) }
72   .rel.dtors      : { *(.rel.dtors) }
73   .rela.dtors     : { *(.rela.dtors) }
74   .rel.got        : { *(.rel.got) }
75   .rela.got       : { *(.rela.got) }
76   .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
77   .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
78   .rel.plt        : { *(.rel.plt) }
79   .rela.plt       : { *(.rela.plt) }
80   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) } :segrodata
81   .rodata1        : { *(.rodata1) }
82   .eh_frame_hdr : { *(.eh_frame_hdr) }
83   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
84   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
85   /* Adjust the address for the data segment.  We want to adjust up to
86      the same address within the page on the next page up.  */
87   . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
88   /* Exception handling  */
89   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
90   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
91   /* Thread Local Storage sections  */
92   .tdata          : { *(.tdata .tdata.* .gnu.linkonce.td.*) } :segrodata :tls
93   .tbss           : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
94   .preinit_array     :
95   {
96     KEEP (*(.preinit_array))
97   } :segdata
98   .init_array     :
99   {
100      KEEP (*(SORT(.init_array.*)))
101      KEEP (*(.init_array))
102   }
103   .fini_array     :
104   {
105     KEEP (*(.fini_array))
106     KEEP (*(SORT(.fini_array.*)))
107   }
108   .ctors          :
109   {
110     /* gcc uses crtbegin.o to find the start of
111        the constructors, so we make sure it is
112        first.  Because this is a wildcard, it
113        doesn't matter if the user does not
114        actually link against crtbegin.o; the
115        linker won't look for a file to match a
116        wildcard.  The wildcard also means that it
117        doesn't matter which directory crtbegin.o
118        is in.  */
119     KEEP (*crtbegin.o(.ctors))
120     KEEP (*crtbegin?.o(.ctors))
121     /* We don't want to include the .ctor section from
122        the crtend.o file until after the sorted ctors.
123        The .ctor section from the crtend file contains the
124        end of ctors marker and it must be last */
125     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
126     KEEP (*(SORT(.ctors.*)))
127     KEEP (*(.ctors))
128   }
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) } :dynamic :segdata
140   .got            : { *(.got) } :segdata
141   . = DATA_SEGMENT_RELRO_END (12, .);
142   .got.plt        : { *(.got.plt) }
143   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
144   .data           :
145   {
146     *(.data .data.* .gnu.linkonce.d.*)
147     KEEP (*(.gnu.linkonce.d.*personality*))
148     SORT(CONSTRUCTORS)
149   }
150   .data1          : { *(.data1) }
151   _edata = .; PROVIDE (edata = .);
152   __bss_start = .;
153   .bss            :
154   {
155    *(.dynbss)
156    *(.bss .bss.* .gnu.linkonce.b.*)
157    *(COMMON)
158    /* Align here to ensure that the .bss section occupies space up to
159       _end.  Align after .bss to ensure correct alignment even if the
160       .bss section disappears because there are no input sections.
161       FIXME: Why do we need it? When there is no .bss section, we don't
162       pad the .data section.  */
163    . = ALIGN(. != 0 ? 32 / 8 : 1);
164   }
165   . = ALIGN(32 / 8);
166   . = ALIGN(32 / 8);
167   _end = .; PROVIDE (end = .);
168   . = DATA_SEGMENT_END (.);
169   /* Stabs debugging sections.  */
170   .stab          0 : { *(.stab) }
171   .stabstr       0 : { *(.stabstr) }
172   .stab.excl     0 : { *(.stab.excl) }
173   .stab.exclstr  0 : { *(.stab.exclstr) }
174   .stab.index    0 : { *(.stab.index) }
175   .stab.indexstr 0 : { *(.stab.indexstr) }
176   .comment       0 : { *(.comment) }
177   /* DWARF debug sections.
178      Symbols in the DWARF debugging sections are relative to the beginning
179      of the section so we begin them at 0.  */
180   /* DWARF 1 */
181   .debug          0 : { *(.debug) }
182   .line           0 : { *(.line) }
183   /* GNU DWARF 1 extensions */
184   .debug_srcinfo  0 : { *(.debug_srcinfo) }
185   .debug_sfnames  0 : { *(.debug_sfnames) }
186   /* DWARF 1.1 and DWARF 2 */
187   .debug_aranges  0 : { *(.debug_aranges) }
188   .debug_pubnames 0 : { *(.debug_pubnames) }
189   /* DWARF 2 */
190   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
191   .debug_abbrev   0 : { *(.debug_abbrev) }
192   .debug_line     0 : { *(.debug_line) }
193   .debug_frame    0 : { *(.debug_frame) }
194   .debug_str      0 : { *(.debug_str) }
195   .debug_loc      0 : { *(.debug_loc) }
196   .debug_macinfo  0 : { *(.debug_macinfo) }
197   /* SGI/MIPS DWARF 2 extensions */
198   .debug_weaknames 0 : { *(.debug_weaknames) }
199   .debug_funcnames 0 : { *(.debug_funcnames) }
200   .debug_typenames 0 : { *(.debug_typenames) }
201   .debug_varnames  0 : { *(.debug_varnames) }
202   /* DWARF 3 */
203   .debug_pubtypes 0 : { *(.debug_pubtypes) }
204   .debug_ranges   0 : { *(.debug_ranges) }
205   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
206   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
207   /DISCARD/ : { *(.note.ABI-tag) }