Don't pad code segments out to 64k any more
[glibc/nacl-glibc.git] / ld / ldscripts / elf_nacl.xs
blobbf384dd47bae005399f5365f047551d3aa89bd0a
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   segtext    PT_LOAD FLAGS(5) ;       /* read + execute */
10   segrodata  PT_LOAD FLAGS(4) ;       /* read */
11   segdata    PT_LOAD FLAGS(6) ;       /* read + write */
12   dynamic    PT_DYNAMIC FLAGS(6) ;
13   stack      PT_GNU_STACK FLAGS(6) ;
14   tls        PT_TLS FLAGS(4) ;
16 SECTIONS
18   /* Read-only sections, merged into text segment: */
19   _begin = 0x0;
20   /* ELF headers are not included in any PT_LOAD segment */
21   . = 0;
22   .init           : SUBALIGN(32)
23   {
24     KEEP (*(.init))
25     . = ALIGN(32); /* ensure nop padding */
26   } :segtext =0x90909090
27   .plt            : { *(.plt) }
28   .text           : SUBALIGN(32)
29   {
30     *(.text .stub .text.* .gnu.linkonce.t.*)
31     KEEP (*(.text.*personality*))
32     /* .gnu.warning sections are handled specially by elf32.em.  */
33     *(.gnu.warning)
34     /* Putting .fini here makes the align pad correctly when .fini is empty.
35        Listing the __libc* sections is also necessary to make padding work. */
36     KEEP (*(.fini))
37     *(__libc_freeres_fn)
38     *(__libc_thread_freeres_fn)
39   } =0x90909090
40   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
41   PROVIDE (__etext = .);
42   PROVIDE (_etext = .);
43   PROVIDE (etext = .);
44   .note.gnu.build-id : { *(.note.gnu.build-id) } :segrodata
45   .hash           : { *(.hash) }
46   .gnu.hash       : { *(.gnu.hash) }
47   .dynsym         : { *(.dynsym) }
48   .dynstr         : { *(.dynstr) }
49   .gnu.version    : { *(.gnu.version) }
50   .gnu.version_d  : { *(.gnu.version_d) }
51   .gnu.version_r  : { *(.gnu.version_r) }
52   .rel.init       : { *(.rel.init) }
53   .rela.init      : { *(.rela.init) }
54   .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
55   .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
56   .rel.fini       : { *(.rel.fini) }
57   .rela.fini      : { *(.rela.fini) }
58   .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
59   .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
60   .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
61   .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
62   .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
63   .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
64   .rel.tdata      : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
65   .rela.tdata     : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
66   .rel.tbss       : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
67   .rela.tbss      : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
68   .rel.ctors      : { *(.rel.ctors) }
69   .rela.ctors     : { *(.rela.ctors) }
70   .rel.dtors      : { *(.rel.dtors) }
71   .rela.dtors     : { *(.rela.dtors) }
72   .rel.got        : { *(.rel.got) }
73   .rela.got       : { *(.rela.got) }
74   .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
75   .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
76   .rel.plt        : { *(.rel.plt) }
77   .rela.plt       : { *(.rela.plt) }
78   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) } :segrodata
79   .rodata1        : { *(.rodata1) }
80   .eh_frame_hdr : { *(.eh_frame_hdr) }
81   . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
82   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) } :segdata
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.*) } :segdata :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) }