Also link libc_pic.os in shortcut script
[glibc/nacl-glibc.git] / elf_i386.xs
blob624da4781d9722b989bf78b0143c9bdc0b5bf271
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   } =0x90909090
37   .fini           : SUBALIGN(32)
38   {
39     KEEP (*(.fini))
40   } =0x90909090
41   PROVIDE (__etext = .);
42   PROVIDE (_etext = .);
43   PROVIDE (etext = .);
44   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
45   .note.gnu.build-id : { *(.note.gnu.build-id) } :segrodata
46   .hash           : { *(.hash) }
47   .gnu.hash       : { *(.gnu.hash) }
48   .dynsym         : { *(.dynsym) }
49   .dynstr         : { *(.dynstr) }
50   .gnu.version    : { *(.gnu.version) }
51   .gnu.version_d  : { *(.gnu.version_d) }
52   .gnu.version_r  : { *(.gnu.version_r) }
53   .rel.init       : { *(.rel.init) }
54   .rela.init      : { *(.rela.init) }
55   .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
56   .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
57   .rel.fini       : { *(.rel.fini) }
58   .rela.fini      : { *(.rela.fini) }
59   .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
60   .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
61   .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
62   .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
63   .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
64   .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
65   .rel.tdata      : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
66   .rela.tdata     : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
67   .rel.tbss       : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
68   .rela.tbss      : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
69   .rel.ctors      : { *(.rel.ctors) }
70   .rela.ctors     : { *(.rela.ctors) }
71   .rel.dtors      : { *(.rel.dtors) }
72   .rela.dtors     : { *(.rela.dtors) }
73   .rel.got        : { *(.rel.got) }
74   .rela.got       : { *(.rela.got) }
75   .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
76   .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
77   .rel.plt        : { *(.rel.plt) }
78   .rela.plt       : { *(.rela.plt) }
79   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) } :segrodata
80   .rodata1        : { *(.rodata1) }
81   .eh_frame_hdr : { *(.eh_frame_hdr) }
82   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
83   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
84   /* Adjust the address for the data segment.  We want to adjust up to
85      the same address within the page on the next page up.  */
86   . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
87   /* Exception handling  */
88   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
89   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
90   /* Thread Local Storage sections  */
91   .tdata          : { *(.tdata .tdata.* .gnu.linkonce.td.*) } :segrodata :tls
92   .tbss           : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
93   .preinit_array     :
94   {
95     KEEP (*(.preinit_array))
96   } :segdata
97   .init_array     :
98   {
99      KEEP (*(SORT(.init_array.*)))
100      KEEP (*(.init_array))
101   }
102   .fini_array     :
103   {
104     KEEP (*(.fini_array))
105     KEEP (*(SORT(.fini_array.*)))
106   }
107   .ctors          :
108   {
109     /* gcc uses crtbegin.o to find the start of
110        the constructors, so we make sure it is
111        first.  Because this is a wildcard, it
112        doesn't matter if the user does not
113        actually link against crtbegin.o; the
114        linker won't look for a file to match a
115        wildcard.  The wildcard also means that it
116        doesn't matter which directory crtbegin.o
117        is in.  */
118     KEEP (*crtbegin.o(.ctors))
119     KEEP (*crtbegin?.o(.ctors))
120     /* We don't want to include the .ctor section from
121        the crtend.o file until after the sorted ctors.
122        The .ctor section from the crtend file contains the
123        end of ctors marker and it must be last */
124     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
125     KEEP (*(SORT(.ctors.*)))
126     KEEP (*(.ctors))
127   }
128   .dtors          :
129   {
130     KEEP (*crtbegin.o(.dtors))
131     KEEP (*crtbegin?.o(.dtors))
132     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
133     KEEP (*(SORT(.dtors.*)))
134     KEEP (*(.dtors))
135   }
136   .jcr            : { KEEP (*(.jcr)) }
137   .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
138   .dynamic        : { *(.dynamic) } :dynamic :segdata
139   .got            : { *(.got) } :segdata
140   . = DATA_SEGMENT_RELRO_END (12, .);
141   .got.plt        : { *(.got.plt) }
142   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
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 ? 32 / 8 : 1);
163   }
164   . = ALIGN(32 / 8);
165   . = ALIGN(32 / 8);
166   _end = .; PROVIDE (end = .);
167   . = DATA_SEGMENT_END (.);
168   /* Stabs debugging sections.  */
169   .stab          0 : { *(.stab) }
170   .stabstr       0 : { *(.stabstr) }
171   .stab.excl     0 : { *(.stab.excl) }
172   .stab.exclstr  0 : { *(.stab.exclstr) }
173   .stab.index    0 : { *(.stab.index) }
174   .stab.indexstr 0 : { *(.stab.indexstr) }
175   .comment       0 : { *(.comment) }
176   /* DWARF debug sections.
177      Symbols in the DWARF debugging sections are relative to the beginning
178      of the section so we begin them at 0.  */
179   /* DWARF 1 */
180   .debug          0 : { *(.debug) }
181   .line           0 : { *(.line) }
182   /* GNU DWARF 1 extensions */
183   .debug_srcinfo  0 : { *(.debug_srcinfo) }
184   .debug_sfnames  0 : { *(.debug_sfnames) }
185   /* DWARF 1.1 and DWARF 2 */
186   .debug_aranges  0 : { *(.debug_aranges) }
187   .debug_pubnames 0 : { *(.debug_pubnames) }
188   /* DWARF 2 */
189   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
190   .debug_abbrev   0 : { *(.debug_abbrev) }
191   .debug_line     0 : { *(.debug_line) }
192   .debug_frame    0 : { *(.debug_frame) }
193   .debug_str      0 : { *(.debug_str) }
194   .debug_loc      0 : { *(.debug_loc) }
195   .debug_macinfo  0 : { *(.debug_macinfo) }
196   /* SGI/MIPS DWARF 2 extensions */
197   .debug_weaknames 0 : { *(.debug_weaknames) }
198   .debug_funcnames 0 : { *(.debug_funcnames) }
199   .debug_typenames 0 : { *(.debug_typenames) }
200   .debug_varnames  0 : { *(.debug_varnames) }
201   /* DWARF 3 */
202   .debug_pubtypes 0 : { *(.debug_pubtypes) }
203   .debug_ranges   0 : { *(.debug_ranges) }
204   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
205   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
206   /DISCARD/ : { *(.note.ABI-tag) }