1 /* Script for ld --shared: link shared library */
2 OUTPUT_FORMAT("elf32-nacl", "elf32-nacl",
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");
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) ;
17 /* TODO: do we need a stack? */
21 /* Read-only sections, merged into text segment: */
23 . = 0x0 + SIZEOF_HEADERS;
24 . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
28 } :segtext =0x90909090
32 *(.text .stub .text.* .gnu.linkonce.t.*)
33 KEEP (*(.text.*personality*))
34 /* .gnu.warning sections are handled specially by elf32.em. */
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. */
40 *(__libc_thread_freeres_fn)
41 . = ALIGN(CONSTANT (MAXPAGESIZE)); /* nacl wants page alignment */
43 PROVIDE (__etext = .);
46 .note.gnu.build-id : { *(.note.gnu.build-id) } :segrodata
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) }
96 KEEP (*(.preinit_array))
100 KEEP (*(SORT(.init_array.*)))
101 KEEP (*(.init_array))
105 KEEP (*(.fini_array))
106 KEEP (*(SORT(.fini_array.*)))
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
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.*)))
131 KEEP (*crtbegin.o(.dtors))
132 KEEP (*crtbegin?.o(.dtors))
133 KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
134 KEEP (*(SORT(.dtors.*)))
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 */
146 *(.data .data.* .gnu.linkonce.d.*)
147 KEEP (*(.gnu.linkonce.d.*personality*))
150 .data1 : { *(.data1) }
151 _edata = .; PROVIDE (edata = .);
156 *(.bss .bss.* .gnu.linkonce.b.*)
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);
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. */
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) }
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) }
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) }