]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - ld/scripttempl/avr.sc
Move AVR .promemx.* sections into higher memory.
[thirdparty/binutils-gdb.git] / ld / scripttempl / avr.sc
1 # Copyright (C) 2014-2017 Free Software Foundation, Inc.
2 #
3 # Copying and distribution of this file, with or without modification,
4 # are permitted in any medium without royalty provided the copyright
5 # notice and this notice are preserved.
6
7 # RODATA_PM_OFFSET
8 # If empty, .rodata sections will be part of .data. This is for
9 # devices where it is not possible to use LD* instructions to read
10 # from flash.
11 #
12 # If non-empty, .rodata is not part of .data and the .rodata
13 # objects are assigned addresses at an offest of RODATA_PM_OFFSET.
14 # This is for devices that feature reading from flash by means of
15 # LD* instructions, provided the addresses are offset by
16 # __RODATA_PM_OFFSET__ (which defaults to RODATA_PM_OFFSET).
17
18 cat <<EOF
19 /* Copyright (C) 2014-2017 Free Software Foundation, Inc.
20
21 Copying and distribution of this script, with or without modification,
22 are permitted in any medium without royalty provided the copyright
23 notice and this notice are preserved. */
24
25 OUTPUT_FORMAT("${OUTPUT_FORMAT}","${OUTPUT_FORMAT}","${OUTPUT_FORMAT}")
26 OUTPUT_ARCH(${ARCH})
27
28 __TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : $TEXT_LENGTH;
29 __DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : $DATA_LENGTH;
30 ${EEPROM_LENGTH+__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : $EEPROM_LENGTH;}
31 __FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : $FUSE_LENGTH;
32 __LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : $LOCK_LENGTH;
33 __SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : $SIGNATURE_LENGTH;
34 ${USER_SIGNATURE_LENGTH+__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : $USER_SIGNATURE_LENGTH;}
35 ${RODATA_PM_OFFSET+__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : $RODATA_PM_OFFSET;}
36 MEMORY
37 {
38 text (rx) : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__
39 data (rw!x) : ORIGIN = $DATA_ORIGIN, LENGTH = __DATA_REGION_LENGTH__
40 ${EEPROM_LENGTH+ eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__}
41 $FUSE_NAME (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
42 lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
43 signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
44 ${USER_SIGNATURE_LENGTH+ user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__}
45 }
46
47 SECTIONS
48 {
49 /* Read-only sections, merged into text segment: */
50 ${TEXT_DYNAMIC+${DYNAMIC}}
51 .hash ${RELOCATING-0} : { *(.hash) }
52 .dynsym ${RELOCATING-0} : { *(.dynsym) }
53 .dynstr ${RELOCATING-0} : { *(.dynstr) }
54 .gnu.version ${RELOCATING-0} : { *(.gnu.version) }
55 .gnu.version_d ${RELOCATING-0} : { *(.gnu.version_d) }
56 .gnu.version_r ${RELOCATING-0} : { *(.gnu.version_r) }
57
58 .rel.init ${RELOCATING-0} : { *(.rel.init) }
59 .rela.init ${RELOCATING-0} : { *(.rela.init) }
60 .rel.text ${RELOCATING-0} :
61 {
62 *(.rel.text)
63 ${RELOCATING+*(.rel.text.*)}
64 ${RELOCATING+*(.rel.gnu.linkonce.t*)}
65 }
66 .rela.text ${RELOCATING-0} :
67 {
68 *(.rela.text)
69 ${RELOCATING+*(.rela.text.*)}
70 ${RELOCATING+*(.rela.gnu.linkonce.t*)}
71 }
72 .rel.fini ${RELOCATING-0} : { *(.rel.fini) }
73 .rela.fini ${RELOCATING-0} : { *(.rela.fini) }
74 .rel.rodata ${RELOCATING-0} :
75 {
76 *(.rel.rodata)
77 ${RELOCATING+*(.rel.rodata.*)}
78 ${RELOCATING+*(.rel.gnu.linkonce.r*)}
79 }
80 .rela.rodata ${RELOCATING-0} :
81 {
82 *(.rela.rodata)
83 ${RELOCATING+*(.rela.rodata.*)}
84 ${RELOCATING+*(.rela.gnu.linkonce.r*)}
85 }
86 .rel.data ${RELOCATING-0} :
87 {
88 *(.rel.data)
89 ${RELOCATING+*(.rel.data.*)}
90 ${RELOCATING+*(.rel.gnu.linkonce.d*)}
91 }
92 .rela.data ${RELOCATING-0} :
93 {
94 *(.rela.data)
95 ${RELOCATING+*(.rela.data.*)}
96 ${RELOCATING+*(.rela.gnu.linkonce.d*)}
97 }
98 .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
99 .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
100 .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
101 .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
102 .rel.got ${RELOCATING-0} : { *(.rel.got) }
103 .rela.got ${RELOCATING-0} : { *(.rela.got) }
104 .rel.bss ${RELOCATING-0} : { *(.rel.bss) }
105 .rela.bss ${RELOCATING-0} : { *(.rela.bss) }
106 .rel.plt ${RELOCATING-0} : { *(.rel.plt) }
107 .rela.plt ${RELOCATING-0} : { *(.rela.plt) }
108
109 /* Internal text space or external memory. */
110 .text ${RELOCATING-0} :
111 {
112 *(.vectors)
113 KEEP(*(.vectors))
114
115 /* For data that needs to reside in the lower 64k of progmem. */
116 ${RELOCATING+ *(.progmem.gcc*)}
117
118 /* PR 13812: Placing the trampolines here gives a better chance
119 that they will be in range of the code that uses them. */
120 ${RELOCATING+. = ALIGN(2);}
121 ${CONSTRUCTING+ __trampolines_start = . ; }
122 /* The jump trampolines for the 16-bit limited relocs will reside here. */
123 *(.trampolines)
124 ${RELOCATING+ *(.trampolines*)}
125 ${CONSTRUCTING+ __trampolines_end = . ; }
126
127 /* avr-libc expects these data to reside in lower 64K. */
128 ${RELOCATING+ *libprintf_flt.a:*(.progmem.data)}
129 ${RELOCATING+ *libc.a:*(.progmem.data)}
130
131 ${RELOCATING+ *(.progmem.*)}
132
133 ${RELOCATING+. = ALIGN(2);}
134
135 /* For code that needs to reside in the lower 128k progmem. */
136 *(.lowtext)
137 ${RELOCATING+ *(.lowtext*)}
138
139 ${CONSTRUCTING+ __ctors_start = . ; }
140 ${CONSTRUCTING+ *(.ctors) }
141 ${CONSTRUCTING+ __ctors_end = . ; }
142 ${CONSTRUCTING+ __dtors_start = . ; }
143 ${CONSTRUCTING+ *(.dtors) }
144 ${CONSTRUCTING+ __dtors_end = . ; }
145 KEEP(SORT(*)(.ctors))
146 KEEP(SORT(*)(.dtors))
147
148 /* From this point on, we don't bother about wether the insns are
149 below or above the 16 bits boundary. */
150 *(.init0) /* Start here after reset. */
151 KEEP (*(.init0))
152 *(.init1)
153 KEEP (*(.init1))
154 *(.init2) /* Clear __zero_reg__, set up stack pointer. */
155 KEEP (*(.init2))
156 *(.init3)
157 KEEP (*(.init3))
158 *(.init4) /* Initialize data and BSS. */
159 KEEP (*(.init4))
160 *(.init5)
161 KEEP (*(.init5))
162 *(.init6) /* C++ constructors. */
163 KEEP (*(.init6))
164 *(.init7)
165 KEEP (*(.init7))
166 *(.init8)
167 KEEP (*(.init8))
168 *(.init9) /* Call main(). */
169 KEEP (*(.init9))
170 *(.text)
171 ${RELOCATING+. = ALIGN(2);}
172 ${RELOCATING+ *(.text.*)}
173 ${RELOCATING+. = ALIGN(2);}
174 *(.fini9) /* _exit() starts here. */
175 KEEP (*(.fini9))
176 *(.fini8)
177 KEEP (*(.fini8))
178 *(.fini7)
179 KEEP (*(.fini7))
180 *(.fini6) /* C++ destructors. */
181 KEEP (*(.fini6))
182 *(.fini5)
183 KEEP (*(.fini5))
184 *(.fini4)
185 KEEP (*(.fini4))
186 *(.fini3)
187 KEEP (*(.fini3))
188 *(.fini2)
189 KEEP (*(.fini2))
190 *(.fini1)
191 KEEP (*(.fini1))
192 *(.fini0) /* Infinite loop after program termination. */
193 KEEP (*(.fini0))
194
195 /* For code that needs not to reside in the lower progmem. */
196 *(.hightext)
197 ${RELOCATING+ *(.hightext*)}
198
199 ${RELOCATING+ *(.progmemx.*)}
200
201 ${RELOCATING+. = ALIGN(2);}
202
203 /* For tablejump instruction arrays. We don't relax
204 JMP / CALL instructions within these sections. */
205 *(.jumptables)
206 ${RELOCATING+ *(.jumptables*)}
207
208 ${RELOCATING+ _etext = . ; }
209 } ${RELOCATING+ > text}
210 EOF
211
212 # Devices like ATtiny816 allow to read from flash memory by means of LD*
213 # instructions provided we add an offset of __RODATA_PM_OFFSET__ to the
214 # flash addresses.
215
216 if test -n "$RODATA_PM_OFFSET"; then
217 cat <<EOF
218 .rodata ${RELOCATING+ ADDR(.text) + SIZEOF (.text) + __RODATA_PM_OFFSET__ } ${RELOCATING-0} :
219 {
220 *(.rodata)
221 ${RELOCATING+ *(.rodata*)}
222 *(.gnu.linkonce.r*)
223 } ${RELOCATING+AT> text}
224 EOF
225 fi
226
227 cat <<EOF
228 .data ${RELOCATING-0} :
229 {
230 ${RELOCATING+ PROVIDE (__data_start = .) ; }
231 *(.data)
232 ${RELOCATING+ *(.data*)}
233 *(.gnu.linkonce.d*)
234 EOF
235
236 # Classical devices that don't show flash memory in the SRAM address space
237 # need .rodata to be part of .data because the compiler will use LD*
238 # instructions and LD* cannot access flash.
239
240 if test -z "$RODATA_PM_OFFSET"; then
241 cat <<EOF
242 *(.rodata) /* We need to include .rodata here if gcc is used */
243 ${RELOCATING+ *(.rodata*)} /* with -fdata-sections. */
244 *(.gnu.linkonce.r*)
245 EOF
246 fi
247
248 cat <<EOF
249 ${RELOCATING+. = ALIGN(2);}
250 ${RELOCATING+ _edata = . ; }
251 ${RELOCATING+ PROVIDE (__data_end = .) ; }
252 } ${RELOCATING+ > data ${RELOCATING+AT> text}}
253
254 .bss ${RELOCATING+ ADDR(.data) + SIZEOF (.data)} ${RELOCATING-0} :${RELOCATING+ AT (ADDR (.bss))}
255 {
256 ${RELOCATING+ PROVIDE (__bss_start = .) ; }
257 *(.bss)
258 ${RELOCATING+ *(.bss*)}
259 *(COMMON)
260 ${RELOCATING+ PROVIDE (__bss_end = .) ; }
261 } ${RELOCATING+ > data}
262
263 ${RELOCATING+ __data_load_start = LOADADDR(.data); }
264 ${RELOCATING+ __data_load_end = __data_load_start + SIZEOF(.data); }
265
266 /* Global data not cleared after reset. */
267 .noinit ${RELOCATING+ ADDR(.bss) + SIZEOF (.bss)} ${RELOCATING-0}: ${RELOCATING+ AT (ADDR (.noinit))}
268 {
269 ${RELOCATING+ PROVIDE (__noinit_start = .) ; }
270 *(.noinit*)
271 ${RELOCATING+ PROVIDE (__noinit_end = .) ; }
272 ${RELOCATING+ _end = . ; }
273 ${RELOCATING+ PROVIDE (__heap_start = .) ; }
274 } ${RELOCATING+ > data}
275 EOF
276
277 if test -n "${EEPROM_LENGTH}"; then
278 cat <<EOF
279
280 .eeprom ${RELOCATING-0}:
281 {
282 /* See .data above... */
283 KEEP(*(.eeprom*))
284 ${RELOCATING+ __eeprom_end = . ; }
285 } ${RELOCATING+ > eeprom}
286 EOF
287 fi
288
289 if test "$FUSE_NAME" = "fuse" ; then
290 cat <<EOF
291
292 .fuse ${RELOCATING-0}:
293 {
294 KEEP(*(.fuse))
295 KEEP(*(.lfuse))
296 KEEP(*(.hfuse))
297 KEEP(*(.efuse))
298 } ${RELOCATING+ > fuse}
299 EOF
300 fi
301
302 cat <<EOF
303
304 .lock ${RELOCATING-0}:
305 {
306 KEEP(*(.lock*))
307 } ${RELOCATING+ > lock}
308
309 .signature ${RELOCATING-0}:
310 {
311 KEEP(*(.signature*))
312 } ${RELOCATING+ > signature}
313 EOF
314
315 if test "$FUSE_NAME" = "config" ; then
316 cat <<EOF
317
318 .config ${RELOCATING-0}:
319 {
320 KEEP(*(.config*))
321 } ${RELOCATING+ > config}
322 EOF
323 fi
324
325 cat <<EOF
326
327 /* Stabs debugging sections. */
328 .stab 0 : { *(.stab) }
329 .stabstr 0 : { *(.stabstr) }
330 .stab.excl 0 : { *(.stab.excl) }
331 .stab.exclstr 0 : { *(.stab.exclstr) }
332 .stab.index 0 : { *(.stab.index) }
333 .stab.indexstr 0 : { *(.stab.indexstr) }
334 .comment 0 : { *(.comment) }
335 .note.gnu.build-id : { *(.note.gnu.build-id) }
336 EOF
337
338 . $srcdir/scripttempl/DWARF.sc
339
340 cat <<EOF
341 }
342 EOF