Protoization.
[deliverable/binutils-gdb.git] / ld / scripttempl / elf.sc
CommitLineData
252b5132
RH
1#
2# Unusual variables checked by this code:
3# NOP - two byte opcode for no-op (defaults to 0)
4# DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
5# INITIAL_READONLY_SECTIONS - at start of text segment
6# OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
7# (e.g., .PARISC.milli)
8# OTHER_TEXT_SECTIONS - these get put in .text when relocating
9# OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
10# (e.g., .PARISC.global)
904ecb2d 11# OTHER_BSS_SECTIONS - other than .bss .sbss ...
252b5132
RH
12# OTHER_SECTIONS - at the end
13# EXECUTABLE_SYMBOLS - symbols that must be defined for an
14# executable (e.g., _DYNAMIC_LINK)
15# TEXT_START_SYMBOLS - symbols that appear at the start of the
16# .text section.
17# DATA_START_SYMBOLS - symbols that appear at the start of the
18# .data section.
19# OTHER_GOT_SYMBOLS - symbols defined just before .got.
20# OTHER_GOT_SECTIONS - sections just after .got and .sdata.
21# OTHER_BSS_SYMBOLS - symbols that appear at the start of the
22# .bss section besides __bss_start.
23# DATA_PLT - .plt should be in data segment, not text segment.
6c86c541 24# BSS_PLT - .plt should be in bss segment
252b5132
RH
25# TEXT_DYNAMIC - .dynamic in text segment, not data segment.
26# EMBEDDED - whether this is for an embedded system.
27# SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
28# start address of shared library.
29# INPUT_FILES - INPUT command of files to always include
a8e53fb0 30# WRITABLE_RODATA - if set, the .rodata section should be writable
904ecb2d
JL
31# INIT_START, INIT_END - statements just before and just after
32# combination of .init sections.
33# FINI_START, FINI_END - statements just before and just after
34# combination of .fini sections.
252b5132
RH
35#
36# When adding sections, do note that the names of some sections are used
37# when specifying the start address of the next.
38#
39
9ac4db9c
GK
40/* Many sections come in three flavours. There is the 'real' section,
41 like ".data". Then there are the per-procedure or per-variable
42 sections, generated by -ffunction-sections and -fdata-sections in GCC,
43 and useful for --gc-sections, which for a variable "foo" might be
44 ".data.foo". Then there are the linkonce sections, for which the linker
45 eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
46 The exact correspondences are:
47
48 Section Linkonce section
49 .text .gnu.linkonce.t.foo
50 .rodata .gnu.linkonce.r.foo
51 .data .gnu.linkonce.d.foo
52 .bss .gnu.linkonce.b.foo
53 .sdata .gnu.linkonce.s.foo
54 .sbss .gnu.linkonce.sb.foo
55 .sdata2 .gnu.linkonce.s2.foo
56 .sbss2 .gnu.linkonce.sb2.foo
57
58 Each of these can also have corresponding .rel.* and .rela.* sections.
59*/
60
252b5132
RH
61test -z "$ENTRY" && ENTRY=_start
62test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
63test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
64if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
65test -z "${ELFSIZE}" && ELFSIZE=32
66test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
67test "$LD_FLAG" = "N" && DATA_ADDR=.
68INTERP=".interp ${RELOCATING-0} : { *(.interp) }"
69PLT=".plt ${RELOCATING-0} : { *(.plt) }"
70DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }"
9ac4db9c
GK
71RODATA=".rodata ${RELOCATING-0} : { *(.rodata) ${RELOCATING+*(.rodata.*)} ${RELOCATING+*(.gnu.linkonce.r.*)} }"
72SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2) ${RELOCATING+*(.sbss2.*)} ${RELOCATING+*(.gnu.linkonce.sb2.*)} }"
73SDATA2=".sdata2 ${RELOCATING-0} : { *(.sdata2) ${RELOCATING+*(.sdata2.*)} ${RELOCATING+*(.gnu.linkonce.s2.*)} }"
252b5132
RH
74CTOR=".ctors ${CONSTRUCTING-0} :
75 {
76 ${CONSTRUCTING+${CTOR_START}}
77 /* gcc uses crtbegin.o to find the start of
78 the constructors, so we make sure it is
79 first. Because this is a wildcard, it
80 doesn't matter if the user does not
81 actually link against crtbegin.o; the
82 linker won't look for a file to match a
83 wildcard. The wildcard also means that it
84 doesn't matter which directory crtbegin.o
85 is in. */
86
87 KEEP (*crtbegin.o(.ctors))
88
89 /* We don't want to include the .ctor section from
90 from the crtend.o file until after the sorted ctors.
91 The .ctor section from the crtend file contains the
92 end of ctors marker and it must be last */
93
18625d54 94 KEEP (*(EXCLUDE_FILE (*crtend.o $OTHER_EXCLUDE_FILES) .ctors))
252b5132
RH
95 KEEP (*(SORT(.ctors.*)))
96 KEEP (*(.ctors))
97 ${CONSTRUCTING+${CTOR_END}}
98 }"
99
100DTOR=" .dtors ${CONSTRUCTING-0} :
101 {
102 ${CONSTRUCTING+${DTOR_START}}
103 KEEP (*crtbegin.o(.dtors))
18625d54 104 KEEP (*(EXCLUDE_FILE (*crtend.o $OTHER_EXCLUDE_FILES) .dtors))
252b5132
RH
105 KEEP (*(SORT(.dtors.*)))
106 KEEP (*(.dtors))
107 ${CONSTRUCTING+${DTOR_END}}
108 }"
109
110# if this is for an embedded system, don't add SIZEOF_HEADERS.
111if [ -z "$EMBEDDED" ]; then
112 test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
113else
114 test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
115fi
116
117cat <<EOF
118OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
119 "${LITTLE_OUTPUT_FORMAT}")
120OUTPUT_ARCH(${OUTPUT_ARCH})
121ENTRY(${ENTRY})
122
123${RELOCATING+${LIB_SEARCH_DIRS}}
124${RELOCATING+/* Do we need any of these for elf?
125 __DYNAMIC = 0; ${STACKZERO+${STACKZERO}} ${SHLIB_PATH+${SHLIB_PATH}} */}
126${RELOCATING+${EXECUTABLE_SYMBOLS}}
127${RELOCATING+${INPUT_FILES}}
128${RELOCATING- /* For some reason, the Solaris linker makes bad executables
129 if gld -r is used and the intermediate file has sections starting
130 at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld
131 bug. But for now assigning the zero vmas works. */}
132
133SECTIONS
134{
135 /* Read-only sections, merged into text segment: */
136 ${CREATE_SHLIB-${RELOCATING+. = ${TEXT_BASE_ADDRESS};}}
137 ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
138 ${CREATE_SHLIB-${INTERP}}
139 ${INITIAL_READONLY_SECTIONS}
140 ${TEXT_DYNAMIC+${DYNAMIC}}
141 .hash ${RELOCATING-0} : { *(.hash) }
142 .dynsym ${RELOCATING-0} : { *(.dynsym) }
143 .dynstr ${RELOCATING-0} : { *(.dynstr) }
144 .gnu.version ${RELOCATING-0} : { *(.gnu.version) }
145 .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d) }
146 .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r) }
9e4141bc 147
4ab10e93
GK
148 .rel.init ${RELOCATING-0} : { *(.rel.init) }
149 .rela.init ${RELOCATING-0} : { *(.rela.init) }
252b5132
RH
150 .rel.text ${RELOCATING-0} :
151 {
152 *(.rel.text)
153 ${RELOCATING+*(.rel.text.*)}
9ac4db9c 154 ${RELOCATING+*(.rel.gnu.linkonce.t.*)}
252b5132
RH
155 }
156 .rela.text ${RELOCATING-0} :
157 {
158 *(.rela.text)
159 ${RELOCATING+*(.rela.text.*)}
9ac4db9c 160 ${RELOCATING+*(.rela.gnu.linkonce.t.*)}
252b5132 161 }
9e4141bc
RH
162 .rel.fini ${RELOCATING-0} : { *(.rel.fini) }
163 .rela.fini ${RELOCATING-0} : { *(.rela.fini) }
252b5132
RH
164 .rel.rodata ${RELOCATING-0} :
165 {
166 *(.rel.rodata)
167 ${RELOCATING+*(.rel.rodata.*)}
9ac4db9c 168 ${RELOCATING+*(.rel.gnu.linkonce.r.*)}
252b5132
RH
169 }
170 .rela.rodata ${RELOCATING-0} :
171 {
172 *(.rela.rodata)
173 ${RELOCATING+*(.rela.rodata.*)}
9ac4db9c 174 ${RELOCATING+*(.rela.gnu.linkonce.r.*)}
252b5132 175 }
9e4141bc
RH
176 ${OTHER_READONLY_RELOC_SECTIONS}
177 .rel.data ${RELOCATING-0} :
178 {
179 *(.rel.data)
180 ${RELOCATING+*(.rel.data.*)}
9ac4db9c 181 ${RELOCATING+*(.rel.gnu.linkonce.d.*)}
9e4141bc
RH
182 }
183 .rela.data ${RELOCATING-0} :
184 {
185 *(.rela.data)
186 ${RELOCATING+*(.rela.data.*)}
9ac4db9c 187 ${RELOCATING+*(.rela.gnu.linkonce.d.*)}
9e4141bc 188 }
252b5132
RH
189 .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
190 .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
191 .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
192 .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
9e4141bc
RH
193 .rel.got ${RELOCATING-0} : { *(.rel.got) }
194 .rela.got ${RELOCATING-0} : { *(.rela.got) }
195 ${OTHER_GOT_RELOC_SECTIONS}
cfd0966c
GK
196 .rel.sdata ${RELOCATING-0} :
197 {
198 *(.rel.sdata)
199 ${RELOCATING+*(.rel.sdata.*)}
9ac4db9c 200 ${RELOCATING+*(.rel.gnu.linkonce.s.*)}
cfd0966c
GK
201 }
202 .rela.sdata ${RELOCATING-0} :
203 {
204 *(.rela.sdata)
205 ${RELOCATING+*(.rela.sdata.*)}
9ac4db9c
GK
206 ${RELOCATING+*(.rela.gnu.linkonce.s.*)}
207 }
208 .rel.sbss ${RELOCATING-0} :
209 {
210 *(.rel.sbss)
211 ${RELOCATING+*(.rel.sbss.*)}
212 ${RELOCATING+*(.rel.gnu.linkonce.sb.*)}
213 }
214 .rela.sbss ${RELOCATING-0} :
215 {
216 *(.rela.sbss)
217 ${RELOCATING+*(.rela.sbss.*)}
218 ${RELOCATING+*(.rel.gnu.linkonce.sb.*)}
219 }
220 .rel.sdata2 ${RELOCATING-0} :
221 {
222 *(.rel.sdata2)
223 ${RELOCATING+*(.rel.sdata2.*)}
224 ${RELOCATING+*(.rel.gnu.linkonce.s2.*)}
225 }
226 .rela.sdata2 ${RELOCATING-0} :
227 {
228 *(.rela.sdata2)
229 ${RELOCATING+*(.rela.sdata2.*)}
230 ${RELOCATING+*(.rela.gnu.linkonce.s2.*)}
231 }
232 .rel.sbss2 ${RELOCATING-0} :
233 {
234 *(.rel.sbss2)
235 ${RELOCATING+*(.rel.sbss2.*)}
236 ${RELOCATING+*(.rel.gnu.linkonce.sb2.*)}
237 }
238 .rela.sbss2 ${RELOCATING-0} :
239 {
240 *(.rela.sbss2)
241 ${RELOCATING+*(.rela.sbss2.*)}
242 ${RELOCATING+*(.rela.gnu.linkonce.sb2.*)}
243 }
244 .rel.bss ${RELOCATING-0} :
245 {
246 *(.rel.bss)
247 ${RELOCATING+*(.rel.bss.*)}
248 ${RELOCATING+*(.rel.gnu.linkonce.b.*)}
249 }
250 .rela.bss ${RELOCATING-0} :
251 {
252 *(.rela.bss)
253 ${RELOCATING+*(.rela.bss.*)}
254 ${RELOCATING+*(.rela.gnu.linkonce.b.*)}
cfd0966c 255 }
252b5132
RH
256 .rel.plt ${RELOCATING-0} : { *(.rel.plt) }
257 .rela.plt ${RELOCATING-0} : { *(.rela.plt) }
9e673ad1 258 ${OTHER_PLT_RELOC_SECTIONS}
9e4141bc 259
4ab10e93
GK
260 .init ${RELOCATING-0} :
261 {
53db15ed 262 ${RELOCATING+${INIT_START}}
4ab10e93 263 KEEP (*(.init))
53db15ed 264 ${RELOCATING+${INIT_END}}
4ab10e93
GK
265 } =${NOP-0}
266
6c86c541 267 ${DATA_PLT-${BSS_PLT-${PLT}}}
252b5132
RH
268 .text ${RELOCATING-0} :
269 {
270 ${RELOCATING+${TEXT_START_SYMBOLS}}
271 *(.text)
272 ${RELOCATING+*(.text.*)}
273 *(.stub)
274 /* .gnu.warning sections are handled specially by elf32.em. */
275 *(.gnu.warning)
9ac4db9c 276 ${RELOCATING+*(.gnu.linkonce.t.*)}
252b5132
RH
277 ${RELOCATING+${OTHER_TEXT_SECTIONS}}
278 } =${NOP-0}
904ecb2d
JL
279 .fini ${RELOCATING-0} :
280 {
53db15ed 281 ${RELOCATING+${FINI_START}}
904ecb2d 282 KEEP (*(.fini))
53db15ed 283 ${RELOCATING+${FINI_END}}
904ecb2d 284 } =${NOP-0}
6c86c541
GK
285 ${RELOCATING+PROVIDE (__etext = .);}
286 ${RELOCATING+PROVIDE (_etext = .);}
287 ${RELOCATING+PROVIDE (etext = .);}
a8e53fb0 288 ${WRITABLE_RODATA-${RODATA}}
252b5132 289 .rodata1 ${RELOCATING-0} : { *(.rodata1) }
6c86c541
GK
290 ${CREATE_SHLIB-${SDATA2}}
291 ${CREATE_SHLIB-${SBSS2}}
252b5132
RH
292 ${RELOCATING+${OTHER_READONLY_SECTIONS}}
293
294 /* Adjust the address for the data segment. We want to adjust up to
295 the same address within the page on the next page up. */
296 ${CREATE_SHLIB-${RELOCATING+. = ${DATA_ADDR-ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))};}}
297 ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))};}}
298
299 .data ${RELOCATING-0} :
300 {
301 ${RELOCATING+${DATA_START_SYMBOLS}}
302 *(.data)
303 ${RELOCATING+*(.data.*)}
9ac4db9c 304 ${RELOCATING+*(.gnu.linkonce.d.*)}
252b5132
RH
305 ${CONSTRUCTING+SORT(CONSTRUCTORS)}
306 }
307 .data1 ${RELOCATING-0} : { *(.data1) }
987fd5b4 308 .eh_frame : { KEEP (*(.eh_frame)) }
252b5132 309 .gcc_except_table : { *(.gcc_except_table) }
a8e53fb0 310 ${WRITABLE_RODATA+${RODATA}}
252b5132
RH
311 ${RELOCATING+${OTHER_READWRITE_SECTIONS}}
312 ${RELOCATING+${CTOR}}
313 ${RELOCATING+${DTOR}}
314 ${DATA_PLT+${PLT}}
315 ${RELOCATING+${OTHER_GOT_SYMBOLS}}
6c86c541
GK
316 .got ${RELOCATING-0} : { *(.got.plt) *(.got) }
317 ${CREATE_SHLIB+${SDATA2}}
318 ${CREATE_SHLIB+${SBSS2}}
252b5132
RH
319 ${TEXT_DYNAMIC-${DYNAMIC}}
320 /* We want the small data sections together, so single-instruction offsets
321 can access them all, and initialized data all before uninitialized, so
322 we can shorten the on-disk segment size. */
cfd0966c
GK
323 .sdata ${RELOCATING-0} :
324 {
325 ${RELOCATING+${SDATA_START_SYMBOLS}}
326 *(.sdata)
327 ${RELOCATING+*(.sdata.*)}
328 ${RELOCATING+*(.gnu.linkonce.s.*)}
329 }
252b5132 330 ${RELOCATING+${OTHER_GOT_SECTIONS}}
9e4141bc 331 ${RELOCATING+_edata = .;}
252b5132
RH
332 ${RELOCATING+PROVIDE (edata = .);}
333 ${RELOCATING+__bss_start = .;}
334 ${RELOCATING+${OTHER_BSS_SYMBOLS}}
3c9cf3a3
NC
335 .sbss ${RELOCATING-0} :
336 {
6c86c541
GK
337 ${RELOCATING+PROVIDE (__sbss_start = .);}
338 ${RELOCATING+PROVIDE (___sbss_start = .);}
cfd0966c
GK
339 *(.dynsbss)
340 *(.sbss)
341 ${RELOCATING+*(.sbss.*)}
9ac4db9c 342 ${RELOCATING+*(.gnu.linkonce.sb.*)}
cfd0966c 343 *(.scommon)
6c86c541
GK
344 ${RELOCATING+PROVIDE (__sbss_end = .);}
345 ${RELOCATING+PROVIDE (___sbss_end = .);}
3c9cf3a3 346 }
6c86c541 347 ${BSS_PLT+${PLT}}
252b5132
RH
348 .bss ${RELOCATING-0} :
349 {
350 *(.dynbss)
351 *(.bss)
3c9cf3a3 352 ${RELOCATING+*(.bss.*)}
9ac4db9c 353 ${RELOCATING+*(.gnu.linkonce.b.*)}
252b5132
RH
354 *(COMMON)
355 /* Align here to ensure that the .bss section occupies space up to
356 _end. Align after .bss to ensure correct alignment even if the
357 .bss section disappears because there are no input sections. */
358 ${RELOCATING+. = ALIGN(${ALIGNMENT});}
359 }
904ecb2d 360 ${RELOCATING+${OTHER_BSS_SECTIONS}}
252b5132 361 ${RELOCATING+. = ALIGN(${ALIGNMENT});}
9e4141bc 362 ${RELOCATING+_end = .;}
252b5132
RH
363 ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
364 ${RELOCATING+PROVIDE (end = .);}
365
366 /* Stabs debugging sections. */
367 .stab 0 : { *(.stab) }
368 .stabstr 0 : { *(.stabstr) }
369 .stab.excl 0 : { *(.stab.excl) }
370 .stab.exclstr 0 : { *(.stab.exclstr) }
371 .stab.index 0 : { *(.stab.index) }
372 .stab.indexstr 0 : { *(.stab.indexstr) }
373
374 .comment 0 : { *(.comment) }
375
376 /* DWARF debug sections.
377 Symbols in the DWARF debugging sections are relative to the beginning
378 of the section so we begin them at 0. */
379
380 /* DWARF 1 */
381 .debug 0 : { *(.debug) }
382 .line 0 : { *(.line) }
383
384 /* GNU DWARF 1 extensions */
385 .debug_srcinfo 0 : { *(.debug_srcinfo) }
386 .debug_sfnames 0 : { *(.debug_sfnames) }
387
388 /* DWARF 1.1 and DWARF 2 */
389 .debug_aranges 0 : { *(.debug_aranges) }
390 .debug_pubnames 0 : { *(.debug_pubnames) }
391
392 /* DWARF 2 */
393 .debug_info 0 : { *(.debug_info) }
394 .debug_abbrev 0 : { *(.debug_abbrev) }
395 .debug_line 0 : { *(.debug_line) }
396 .debug_frame 0 : { *(.debug_frame) }
397 .debug_str 0 : { *(.debug_str) }
398 .debug_loc 0 : { *(.debug_loc) }
399 .debug_macinfo 0 : { *(.debug_macinfo) }
400
401 /* SGI/MIPS DWARF 2 extensions */
402 .debug_weaknames 0 : { *(.debug_weaknames) }
403 .debug_funcnames 0 : { *(.debug_funcnames) }
404 .debug_typenames 0 : { *(.debug_typenames) }
405 .debug_varnames 0 : { *(.debug_varnames) }
406
407 ${RELOCATING+${OTHER_RELOCATING_SECTIONS}}
408
409 /* These must appear regardless of ${RELOCATING}. */
410 ${OTHER_SECTIONS}
411}
412EOF
This page took 0.069326 seconds and 4 git commands to generate.