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