elfarcv2.sc revision 1.1.1.5 1 1.1 christos #
2 1.1 christos # Unusual variables checked by this code:
3 1.1 christos # NOP - four byte opcode for no-op (defaults to 0)
4 1.1 christos # NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
5 1.1 christos # empty.
6 1.1 christos # OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
7 1.1 christos # (e.g., .PARISC.milli)
8 1.1 christos # When adding sections, do note that the names of some sections are used
9 1.1 christos # when specifying the start address of the next.
10 1.1 christos #
11 1.1 christos test -z "$ENTRY" && ENTRY=start
12 1.1 christos test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
13 1.1 christos test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
14 1.1 christos # If we request a big endian toolchain, give a big endian linker
15 1.1.1.3 christos test -z "$GOT" && GOT=".got ${RELOCATING-0} : {${RELOCATING+ *(.got.plt)} *(.got) } ${RELOCATING+ > ${DATA_MEMORY}}"
16 1.1.1.4 christos test "${ARC_ENDIAN}" = "big" && OUTPUT_FORMAT=${BIG_OUTPUT_FORMAT}
17 1.1 christos if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
18 1.1 christos test -z "${ELFSIZE}" && ELFSIZE=32
19 1.1 christos test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
20 1.1 christos test "$LD_FLAG" = "N" && DATA_ADDR=.
21 1.1 christos
22 1.1.1.2 christos CTOR=".ctors ${CONSTRUCTING-0} :
23 1.1 christos {
24 1.1 christos ${CONSTRUCTING+${CTOR_START}}
25 1.1 christos /* gcc uses crtbegin.o to find the start of
26 1.1 christos the constructors, so we make sure it is
27 1.1 christos first. Because this is a wildcard, it
28 1.1 christos doesn't matter if the user does not
29 1.1 christos actually link against crtbegin.o; the
30 1.1 christos linker won't look for a file to match a
31 1.1 christos wildcard. The wildcard also means that it
32 1.1 christos doesn't matter which directory crtbegin.o
33 1.1 christos is in. */
34 1.1 christos
35 1.1 christos KEEP (*crtbegin*.o(.ctors))
36 1.1 christos
37 1.1 christos /* We don't want to include the .ctor section from
38 1.1 christos from the crtend.o file until after the sorted ctors.
39 1.1 christos The .ctor section from the crtend file contains the
40 1.1 christos end of ctors marker and it must be last */
41 1.1 christos
42 1.1 christos KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors))
43 1.1 christos KEEP (*(SORT(.ctors.*)))
44 1.1 christos KEEP (*(.ctors))
45 1.1 christos ${CONSTRUCTING+${CTOR_END}}
46 1.1 christos } ${RELOCATING+ > ${DATA_MEMORY}}"
47 1.1 christos DTOR=".dtors ${CONSTRUCTING-0} :
48 1.1 christos {
49 1.1 christos ${CONSTRUCTING+${DTOR_START}}
50 1.1 christos KEEP (*crtbegin*.o(.dtors))
51 1.1 christos KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors))
52 1.1 christos KEEP (*(SORT(.dtors.*)))
53 1.1 christos KEEP (*(.dtors))
54 1.1 christos ${CONSTRUCTING+${DTOR_END}}
55 1.1 christos } ${RELOCATING+ > ${DATA_MEMORY}}"
56 1.1 christos
57 1.1.1.3 christos IVT="
58 1.1.1.3 christos /* If the 'ivtbase_addr' symbol is defined, it indicates the base address of
59 1.1.1.3 christos the interrupt vectors. See description of INT_VECTOR_BASE register. */
60 1.1.1.3 christos
61 1.1.1.5 christos .ivt DEFINED (ivtbase_addr) ? ivtbase_addr : ORIGIN(${STARTUP_MEMORY}) :
62 1.1.1.3 christos {
63 1.1.1.3 christos ${RELOCATING+ PROVIDE (__ivtbase_addr = .); }
64 1.1.1.3 christos KEEP (*(.ivt));
65 1.1.1.3 christos } ${RELOCATING+ > ${STARTUP_MEMORY}}"
66 1.1.1.3 christos
67 1.1 christos if test -z "${NO_SMALL_DATA}"; then
68 1.1 christos SBSS=".sbss ${RELOCATING-0} :
69 1.1 christos {
70 1.1 christos ${RELOCATING+PROVIDE (__sbss_start = .);}
71 1.1 christos ${RELOCATING+PROVIDE (___sbss_start = .);}
72 1.1 christos *(.dynsbss)
73 1.1 christos *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
74 1.1 christos *(.scommon)
75 1.1 christos ${RELOCATING+PROVIDE (__sbss_end = .);}
76 1.1 christos ${RELOCATING+PROVIDE (___sbss_end = .);}
77 1.1 christos } ${RELOCATING+ > ${SDATA_MEMORY}}"
78 1.1 christos SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) } ${RELOCATING+ > ${SDATA_MEMORY}}"
79 1.1 christos SDATA="/* We want the small data sections together, so single-instruction offsets
80 1.1 christos can access them all, and initialized data all before uninitialized, so
81 1.1 christos we can shorten the on-disk segment size. */
82 1.1 christos .sdata ${RELOCATING-0} :
83 1.1 christos {
84 1.1 christos ${RELOCATING+${SDATA_START_SYMBOLS}}
85 1.1 christos *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
86 1.1 christos
87 1.1 christos ${RELOCATING+_edata = .;}
88 1.1 christos ${RELOCATING+PROVIDE (edata = .);}
89 1.1 christos } ${RELOCATING+ > ${SDATA_MEMORY}}"
90 1.1 christos SDATA2=".sdata2 ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) } ${RELOCATING+ > ${SDATA_MEMORY}}"
91 1.1 christos REL_SDATA=".rel.sdata ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
92 1.1 christos .rela.sdata ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
93 1.1 christos REL_SBSS=".rel.sbss ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
94 1.1 christos .rela.sbss ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
95 1.1 christos REL_SDATA2=".rel.sdata2 ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
96 1.1 christos .rela.sdata2 ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
97 1.1 christos REL_SBSS2=".rel.sbss2 ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
98 1.1 christos .rela.sbss2 ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
99 1.1 christos fi
100 1.1 christos
101 1.1 christos #
102 1.1 christos # We provide two emulations: a fixed on that defines some memory banks
103 1.1 christos # and a configurable one that includes a user provided memory definition.
104 1.1 christos #
105 1.1 christos case $GENERIC_BOARD in
106 1.1 christos yes|1|YES)
107 1.1.1.5 christos test -z "$MEMORY_FILE" && MEMORY_FILE="memory.x"
108 1.1 christos MEMORY_DEF="
109 1.1 christos /* Get memory banks definition from some user configuration file.
110 1.1 christos This file must be located in some linker directory (search path
111 1.1 christos with -L<dir>). See fixed memory banks emulation script. */
112 1.1.1.5 christos INCLUDE ${MEMORY_FILE};
113 1.1 christos "
114 1.1 christos ;;
115 1.1 christos *)
116 1.1.1.5 christos MEMORY_DEF="
117 1.1.1.5 christos __TEXT_REGION_ORIGIN__ = DEFINED(__TEXT_REGION_ORIGIN__) ? __TEXT_REGION_ORIGIN__ : 0x00;
118 1.1.1.5 christos __TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : ${ICCM_SIZE};
119 1.1.1.5 christos __DATA_REGION_ORIGIN__ = DEFINED(__DATA_REGION_ORIGIN__) ? __DATA_REGION_ORIGIN__ : ${RAM_START_ADDR};
120 1.1.1.5 christos __DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : ${RAM_SIZE};
121 1.1.1.5 christos
122 1.1 christos MEMORY
123 1.1 christos {
124 1.1.1.5 christos ICCM : ORIGIN = __TEXT_REGION_ORIGIN__, LENGTH = __TEXT_REGION_LENGTH__
125 1.1.1.5 christos DCCM : ORIGIN = __DATA_REGION_ORIGIN__, LENGTH = __DATA_REGION_LENGTH__
126 1.1 christos }
127 1.1 christos "
128 1.1 christos ;;
129 1.1 christos esac
130 1.1 christos
131 1.1 christos cat <<EOF
132 1.1 christos OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}", "${LITTLE_OUTPUT_FORMAT}")
133 1.1 christos OUTPUT_ARCH(${OUTPUT_ARCH})
134 1.1 christos ${RELOCATING+ENTRY(${ENTRY})}
135 1.1 christos
136 1.1 christos ${RELOCATING+${LIB_SEARCH_DIRS}}
137 1.1 christos ${RELOCATING+${EXECUTABLE_SYMBOLS}}
138 1.1 christos ${RELOCATING+${MEMORY_DEF}}
139 1.1 christos
140 1.1 christos SECTIONS
141 1.1 christos {
142 1.1.1.3 christos ${RELOCATING+${IVT}}
143 1.1 christos
144 1.1 christos /* Read-only sections, merged into text segment: */
145 1.1 christos ${TEXT_DYNAMIC+${DYNAMIC}}
146 1.1 christos .hash ${RELOCATING-0} : { *(.hash) }
147 1.1 christos .dynsym ${RELOCATING-0} : { *(.dynsym) }
148 1.1 christos .dynstr ${RELOCATING-0} : { *(.dynstr) }
149 1.1 christos .gnu.version ${RELOCATING-0} : { *(.gnu.version) }
150 1.1 christos .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d) }
151 1.1 christos .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r) }
152 1.1 christos
153 1.1 christos .rel.init ${RELOCATING-0} : { *(.rel.init) }
154 1.1 christos .rela.init ${RELOCATING-0} : { *(.rela.init) }
155 1.1 christos .rel.text ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
156 1.1 christos .rela.text ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
157 1.1 christos .rel.fini ${RELOCATING-0} : { *(.rel.fini) }
158 1.1 christos .rela.fini ${RELOCATING-0} : { *(.rela.fini) }
159 1.1 christos .rel.rodata ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
160 1.1 christos .rela.rodata ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
161 1.1 christos .rel.data ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
162 1.1 christos .rela.data ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
163 1.1 christos .rel.tdata ${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
164 1.1 christos .rela.tdata ${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
165 1.1 christos .rel.tbss ${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
166 1.1 christos .rela.tbss ${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
167 1.1 christos .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
168 1.1 christos .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
169 1.1 christos .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
170 1.1 christos .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
171 1.1 christos .rel.got ${RELOCATING-0} : { *(.rel.got) }
172 1.1 christos .rela.got ${RELOCATING-0} : { *(.rela.got) }
173 1.1 christos ${REL_SDATA}
174 1.1 christos ${REL_SBSS}
175 1.1 christos ${REL_SDATA2}
176 1.1 christos ${REL_SBSS2}
177 1.1 christos .rel.bss ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
178 1.1 christos .rela.bss ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
179 1.1 christos
180 1.1.1.3 christos .text ${RELOCATING-0} :
181 1.1 christos {
182 1.1.1.3 christos ${RELOCATING+${TEXT_START_SYMBOLS}}
183 1.1 christos
184 1.1.1.3 christos ${RELOCATING+ . = ALIGN(4);}
185 1.1 christos ${RELOCATING+${INIT_START}}
186 1.1.1.3 christos KEEP (*(SORT_NONE(.init)))
187 1.1 christos ${RELOCATING+${INIT_END}}
188 1.1 christos
189 1.1.1.3 christos /* Start here after reset. */
190 1.1.1.3 christos ${RELOCATING+ . = ALIGN(4);}
191 1.1.1.3 christos KEEP (*crt0.o(.text.__startup))
192 1.1 christos
193 1.1.1.3 christos /* Remaining code. */
194 1.1.1.3 christos ${RELOCATING+ . = ALIGN(4);}
195 1.1 christos *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
196 1.1.1.3 christos /* .gnu.warning sections are handled specially by elf.em. */
197 1.1 christos *(.gnu.warning)
198 1.1 christos
199 1.1 christos ${RELOCATING+${OTHER_TEXT_SECTIONS}}
200 1.1 christos
201 1.1 christos } ${RELOCATING+ > ${TEXT_MEMORY}} =${NOP-0}
202 1.1 christos
203 1.1 christos .fini ${RELOCATING-0} :
204 1.1 christos {
205 1.1 christos ${RELOCATING+${FINI_START}}
206 1.1.1.3 christos KEEP (*(SORT_NONE(.fini)))
207 1.1 christos ${RELOCATING+${FINI_END}}
208 1.1 christos
209 1.1 christos ${RELOCATING+PROVIDE (__etext = .);}
210 1.1 christos ${RELOCATING+PROVIDE (_etext = .);}
211 1.1 christos ${RELOCATING+PROVIDE (etext = .);}
212 1.1 christos } ${RELOCATING+ > ${TEXT_MEMORY}} =${NOP-0}
213 1.1 christos
214 1.1.1.3 christos .jcr ${RELOCATING-0} :
215 1.1.1.3 christos {
216 1.1.1.3 christos KEEP (*(.jcr))
217 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
218 1.1.1.3 christos
219 1.1.1.3 christos .eh_frame ${RELOCATING-0} :
220 1.1.1.3 christos {
221 1.1.1.3 christos KEEP (*(.eh_frame))
222 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
223 1.1.1.3 christos
224 1.1.1.3 christos .gcc_except_table ${RELOCATING-0} :
225 1.1.1.3 christos {
226 1.1.1.3 christos *(.gcc_except_table) *(.gcc_except_table.*)
227 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
228 1.1.1.3 christos
229 1.1.1.3 christos .plt ${RELOCATING-0} :
230 1.1.1.3 christos {
231 1.1.1.3 christos *(.plt)
232 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
233 1.1.1.3 christos
234 1.1.1.3 christos .jlitab ${RELOCATING-0} :
235 1.1.1.3 christos {
236 1.1.1.3 christos ${RELOCATING+${JLI_START_TABLE}}
237 1.1.1.3 christos jlitab*.o:(.jlitab*) *(.jlitab*)
238 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
239 1.1.1.3 christos
240 1.1.1.3 christos .rodata ${RELOCATING-0} :
241 1.1.1.3 christos {
242 1.1.1.3 christos *(.rodata) ${RELOCATING+*(.rodata.*)} ${RELOCATING+*(.gnu.linkonce.r.*)}
243 1.1.1.3 christos } ${RELOCATING+> ${TEXT_MEMORY}}
244 1.1.1.3 christos
245 1.1.1.3 christos .rodata1 ${RELOCATING-0} : { *(.rodata1) } ${RELOCATING+> ${TEXT_MEMORY}}
246 1.1.1.3 christos
247 1.1 christos ${RELOCATING+${OTHER_READONLY_SECTIONS}}
248 1.1 christos
249 1.1 christos /* Start of the data section image in ROM. */
250 1.1 christos ${RELOCATING+__data_image = .;}
251 1.1 christos ${RELOCATING+PROVIDE (__data_image = .);}
252 1.1 christos
253 1.1 christos .data ${RELOCATING-0} :
254 1.1 christos {
255 1.1 christos ${RELOCATING+ PROVIDE (__data_start = .) ; }
256 1.1 christos /* --gc-sections will delete empty .data. This leads to wrong start
257 1.1 christos addresses for subsequent sections because -Tdata= from the command
258 1.1 christos line will have no effect, see PR13697. Thus, keep .data */
259 1.1 christos KEEP (*(.data))
260 1.1 christos ${RELOCATING+${DATA_START_SYMBOLS}}
261 1.1.1.3 christos ${RELOCATING+*(.data.* .gnu.linkonce.d.*)}
262 1.1 christos ${CONSTRUCTING+SORT(CONSTRUCTORS)}
263 1.1 christos
264 1.1 christos } ${RELOCATING+ > ${DATA_MEMORY}}
265 1.1 christos
266 1.1 christos ${GOT}
267 1.1 christos ${RELOCATING+${CTOR}}
268 1.1 christos ${RELOCATING+${DTOR}}
269 1.1 christos
270 1.1 christos ${RELOCATING+${SDATA}}
271 1.1 christos ${RELOCATING+${SDATA2}}
272 1.1 christos ${RELOCATING+${SBSS}}
273 1.1 christos ${RELOCATING+${SBSS2}}
274 1.1 christos .bss ${RELOCATING-0} :
275 1.1 christos {
276 1.1.1.3 christos ${RELOCATING+*(.dynbss)}
277 1.1.1.3 christos *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
278 1.1.1.3 christos ${RELOCATING+*(COMMON)
279 1.1.1.3 christos /* Align here to ensure that the .bss section occupies space up to
280 1.1.1.3 christos _end. Align after .bss to ensure correct alignment even if the
281 1.1.1.3 christos .bss section disappears because there are no input sections. */
282 1.1.1.3 christos . = ALIGN(${ALIGNMENT});}
283 1.1 christos ${RELOCATING+_end = .;}
284 1.1 christos ${RELOCATING+PROVIDE (end = .);}
285 1.1 christos } ${RELOCATING+ > ${DATA_MEMORY}}
286 1.1 christos
287 1.1 christos /* Global data not cleared after reset. */
288 1.1 christos .noinit ${RELOCATING-0}:
289 1.1 christos {
290 1.1.1.4 christos *(.noinit${RELOCATING+ .noinit.* .gnu.linkonce.n.*})
291 1.1 christos ${RELOCATING+. = ALIGN(${ALIGNMENT});}
292 1.1 christos ${RELOCATING+ PROVIDE (__start_heap = .) ; }
293 1.1 christos } ${RELOCATING+ > ${DATA_MEMORY}}
294 1.1 christos
295 1.1.1.3 christos ${RELOCATING+ PROVIDE (__stack_top = (ORIGIN (${DATA_MEMORY}) + LENGTH (${DATA_MEMORY}) - 1) & -4);}
296 1.1.1.3 christos ${RELOCATING+ PROVIDE (__end_heap = ORIGIN (${DATA_MEMORY}) + LENGTH (${DATA_MEMORY}) - 1);}
297 1.1 christos
298 1.1.1.3 christos .note.gnu.build-id : { *(.note.gnu.build-id) }
299 1.1.1.3 christos EOF
300 1.1 christos
301 1.1.1.5 christos source_sh $srcdir/scripttempl/misc-sections.sc
302 1.1.1.5 christos source_sh $srcdir/scripttempl/DWARF.sc
303 1.1 christos
304 1.1.1.3 christos cat <<EOF
305 1.1 christos /* ARC Extension Sections */
306 1.1.1.3 christos .arcextmap 0 : { *(.arcextmap.*) }
307 1.1 christos }
308 1.1 christos EOF
309