Rewrite _dl_runtime_resolve to use nacljmp instead of ret
[glibc/nacl-glibc.git] / elf_i386.xs
blob6b01b3d7143eeec333b40d0f3acd8454e5cb7d6e
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 SECTIONS
9   /* Read-only sections, merged into text segment: */
10   _begin = 0x0;
11   . = 0x0 + SIZEOF_HEADERS;
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.init       : { *(.rel.init) }
21   .rela.init      : { *(.rela.init) }
22   .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
23   .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
24   .rel.fini       : { *(.rel.fini) }
25   .rela.fini      : { *(.rela.fini) }
26   .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
27   .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
28   .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
29   .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
30   .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
31   .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
32   .rel.tdata      : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
33   .rela.tdata     : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
34   .rel.tbss       : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
35   .rela.tbss      : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
36   .rel.ctors      : { *(.rel.ctors) }
37   .rela.ctors     : { *(.rela.ctors) }
38   .rel.dtors      : { *(.rel.dtors) }
39   .rela.dtors     : { *(.rela.dtors) }
40   .rel.got        : { *(.rel.got) }
41   .rela.got       : { *(.rela.got) }
42   .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
43   .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
44   .rel.plt        : { *(.rel.plt) }
45   .rela.plt       : { *(.rela.plt) }
46   .init           : SUBALIGN(32)
47   {
48     KEEP (*(.init))
49   } =0x90909090
50   .plt            : { *(.plt) }
51   .text           : SUBALIGN(32)
52   {
53     *(.text .stub .text.* .gnu.linkonce.t.*)
54     KEEP (*(.text.*personality*))
55     /* .gnu.warning sections are handled specially by elf32.em.  */
56     *(.gnu.warning)
57   } =0x90909090
58   .fini           : SUBALIGN(32)
59   {
60     KEEP (*(.fini))
61   } =0x90909090
62   PROVIDE (__etext = .);
63   PROVIDE (_etext = .);
64   PROVIDE (etext = .);
65   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
66   .rodata1        : { *(.rodata1) }
67   .eh_frame_hdr : { *(.eh_frame_hdr) }
68   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
69   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
70   /* Adjust the address for the data segment.  We want to adjust up to
71      the same address within the page on the next page up.  */
72   . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
73   /* Exception handling  */
74   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
75   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
76   /* Thread Local Storage sections  */
77   .tdata          : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
78   .tbss           : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
79   .preinit_array     :
80   {
81     KEEP (*(.preinit_array))
82   }
83   .init_array     :
84   {
85      KEEP (*(SORT(.init_array.*)))
86      KEEP (*(.init_array))
87   }
88   .fini_array     :
89   {
90     KEEP (*(.fini_array))
91     KEEP (*(SORT(.fini_array.*)))
92   }
93   .ctors          :
94   {
95     /* gcc uses crtbegin.o to find the start of
96        the constructors, so we make sure it is
97        first.  Because this is a wildcard, it
98        doesn't matter if the user does not
99        actually link against crtbegin.o; the
100        linker won't look for a file to match a
101        wildcard.  The wildcard also means that it
102        doesn't matter which directory crtbegin.o
103        is in.  */
104     KEEP (*crtbegin.o(.ctors))
105     KEEP (*crtbegin?.o(.ctors))
106     /* We don't want to include the .ctor section from
107        the crtend.o file until after the sorted ctors.
108        The .ctor section from the crtend file contains the
109        end of ctors marker and it must be last */
110     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
111     KEEP (*(SORT(.ctors.*)))
112     KEEP (*(.ctors))
113   }
114   .dtors          :
115   {
116     KEEP (*crtbegin.o(.dtors))
117     KEEP (*crtbegin?.o(.dtors))
118     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
119     KEEP (*(SORT(.dtors.*)))
120     KEEP (*(.dtors))
121   }
122   .jcr            : { KEEP (*(.jcr)) }
123   .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
124   .dynamic        : { *(.dynamic) }
125   .got            : { *(.got) }
126   . = DATA_SEGMENT_RELRO_END (12, .);
127   .got.plt        : { *(.got.plt) }
128   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
129   .data           :
130   {
131     *(.data .data.* .gnu.linkonce.d.*)
132     KEEP (*(.gnu.linkonce.d.*personality*))
133     SORT(CONSTRUCTORS)
134   }
135   .data1          : { *(.data1) }
136   _edata = .; PROVIDE (edata = .);
137   __bss_start = .;
138   .bss            :
139   {
140    *(.dynbss)
141    *(.bss .bss.* .gnu.linkonce.b.*)
142    *(COMMON)
143    /* Align here to ensure that the .bss section occupies space up to
144       _end.  Align after .bss to ensure correct alignment even if the
145       .bss section disappears because there are no input sections.
146       FIXME: Why do we need it? When there is no .bss section, we don't
147       pad the .data section.  */
148    . = ALIGN(. != 0 ? 32 / 8 : 1);
149   }
150   . = ALIGN(32 / 8);
151   . = ALIGN(32 / 8);
152   _end = .; PROVIDE (end = .);
153   . = DATA_SEGMENT_END (.);
154   /* Stabs debugging sections.  */
155   .stab          0 : { *(.stab) }
156   .stabstr       0 : { *(.stabstr) }
157   .stab.excl     0 : { *(.stab.excl) }
158   .stab.exclstr  0 : { *(.stab.exclstr) }
159   .stab.index    0 : { *(.stab.index) }
160   .stab.indexstr 0 : { *(.stab.indexstr) }
161   .comment       0 : { *(.comment) }
162   /* DWARF debug sections.
163      Symbols in the DWARF debugging sections are relative to the beginning
164      of the section so we begin them at 0.  */
165   /* DWARF 1 */
166   .debug          0 : { *(.debug) }
167   .line           0 : { *(.line) }
168   /* GNU DWARF 1 extensions */
169   .debug_srcinfo  0 : { *(.debug_srcinfo) }
170   .debug_sfnames  0 : { *(.debug_sfnames) }
171   /* DWARF 1.1 and DWARF 2 */
172   .debug_aranges  0 : { *(.debug_aranges) }
173   .debug_pubnames 0 : { *(.debug_pubnames) }
174   /* DWARF 2 */
175   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
176   .debug_abbrev   0 : { *(.debug_abbrev) }
177   .debug_line     0 : { *(.debug_line) }
178   .debug_frame    0 : { *(.debug_frame) }
179   .debug_str      0 : { *(.debug_str) }
180   .debug_loc      0 : { *(.debug_loc) }
181   .debug_macinfo  0 : { *(.debug_macinfo) }
182   /* SGI/MIPS DWARF 2 extensions */
183   .debug_weaknames 0 : { *(.debug_weaknames) }
184   .debug_funcnames 0 : { *(.debug_funcnames) }
185   .debug_typenames 0 : { *(.debug_typenames) }
186   .debug_varnames  0 : { *(.debug_varnames) }
187   /* DWARF 3 */
188   .debug_pubtypes 0 : { *(.debug_pubtypes) }
189   .debug_ranges   0 : { *(.debug_ranges) }
190   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
191   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
192   /DISCARD/ : { *(.note.ABI-tag) }