]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - ld/scripttempl/epiphany_4x4.sc
ChangeLog rotatation and copyright year update
[thirdparty/binutils-gdb.git] / ld / scripttempl / epiphany_4x4.sc
1 # Copyright (C) 2014-2015 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 # Unusual variables checked by this code:
8 # NOP - four byte opcode for no-op (defaults to 0)
9 # NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not
10 # empty.
11 # SMALL_DATA_CTOR - .ctors contains small data.
12 # SMALL_DATA_DTOR - .dtors contains small data.
13 # DATA_ADDR - if end-of-text-plus-one-page isn't right for data start
14 # INITIAL_READONLY_SECTIONS - at start of text segment
15 # OTHER_READONLY_SECTIONS - other than .text .init .rodata ...
16 # (e.g., .PARISC.milli)
17 # OTHER_TEXT_SECTIONS - these get put in .text when relocating
18 # OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ...
19 # (e.g., .PARISC.global)
20 # OTHER_RELRO_SECTIONS - other than .data.rel.ro ...
21 # (e.g. PPC32 .fixup, .got[12])
22 # OTHER_BSS_SECTIONS - other than .bss .sbss ...
23 # ATTRS_SECTIONS - at the end
24 # OTHER_SECTIONS - at the end
25 # EXECUTABLE_SYMBOLS - symbols that must be defined for an
26 # executable (e.g., _DYNAMIC_LINK)
27 # TEXT_START_ADDR - the first byte of the text segment, after any
28 # headers.
29 # TEXT_BASE_ADDRESS - the first byte of the text segment.
30 # TEXT_START_SYMBOLS - symbols that appear at the start of the
31 # .text section.
32 # DATA_START_SYMBOLS - symbols that appear at the start of the
33 # .data section.
34 # DATA_END_SYMBOLS - symbols that appear at the end of the
35 # writeable data sections.
36 # OTHER_GOT_SYMBOLS - symbols defined just before .got.
37 # OTHER_GOT_SECTIONS - sections just after .got.
38 # OTHER_SDATA_SECTIONS - sections just after .sdata.
39 # OTHER_BSS_SYMBOLS - symbols that appear at the start of the
40 # .bss section besides ___bss_start.
41 # DATA_PLT - .plt should be in data segment, not text segment.
42 # PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement.
43 # BSS_PLT - .plt should be in bss segment
44 # NO_REL_RELOCS - Don't include .rel.* sections in script
45 # NO_RELA_RELOCS - Don't include .rela.* sections in script
46 # NON_ALLOC_DYN - Place dynamic sections after data segment.
47 # TEXT_DYNAMIC - .dynamic in text segment, not data segment.
48 # EMBEDDED - whether this is for an embedded system.
49 # SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set
50 # start address of shared library.
51 # INPUT_FILES - INPUT command of files to always include
52 # WRITABLE_RODATA - if set, the .rodata section should be writable
53 # INIT_START, INIT_END - statements just before and just after
54 # combination of .init sections.
55 # FINI_START, FINI_END - statements just before and just after
56 # combination of .fini sections.
57 # STACK_ADDR - start of a .stack section.
58 # OTHER_SYMBOLS - symbols to place right at the end of the script.
59 # ETEXT_NAME - name of a symbol for the end of the text section,
60 # normally etext.
61 # SEPARATE_GOTPLT - if set, .got.plt should be separate output section,
62 # so that .got can be in the RELRO area. It should be set to
63 # the number of bytes in the beginning of .got.plt which can be
64 # in the RELRO area as well.
65 # USER_LABEL_PREFIX - prefix to add to user-visible symbols.
66 #
67 # When adding sections, do note that the names of some sections are used
68 # when specifying the start address of the next.
69 #
70
71 # Many sections come in three flavours. There is the 'real' section,
72 # like ".data". Then there are the per-procedure or per-variable
73 # sections, generated by -ffunction-sections and -fdata-sections in GCC,
74 # and useful for --gc-sections, which for a variable "foo" might be
75 # ".data.foo". Then there are the linkonce sections, for which the linker
76 # eliminates duplicates, which are named like ".gnu.linkonce.d.foo".
77 # The exact correspondences are:
78 #
79 # Section Linkonce section
80 # .text .gnu.linkonce.t.foo
81 # .rodata .gnu.linkonce.r.foo
82 # .data .gnu.linkonce.d.foo
83 # .bss .gnu.linkonce.b.foo
84 # .sdata .gnu.linkonce.s.foo
85 # .sbss .gnu.linkonce.sb.foo
86 # .sdata2 .gnu.linkonce.s2.foo
87 # .sbss2 .gnu.linkonce.sb2.foo
88 # .debug_info .gnu.linkonce.wi.foo
89 # .tdata .gnu.linkonce.td.foo
90 # .tbss .gnu.linkonce.tb.foo
91 # .lrodata .gnu.linkonce.lr.foo
92 # .ldata .gnu.linkonce.l.foo
93 # .lbss .gnu.linkonce.lb.foo
94 #
95 # Each of these can also have corresponding .rel.* and .rela.* sections.
96
97
98 test -z "$ENTRY" && ENTRY=_start
99 test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
100 test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
101 if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
102 test -z "${ELFSIZE}" && ELFSIZE=32
103 test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
104 test "$LD_FLAG" = "N" && DATA_ADDR=.
105 test -z "${ETEXT_NAME}" && ETEXT_NAME=etext
106 test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
107 test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
108 test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
109 test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }"
110 DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
111 DATA_SEGMENT_RELRO_END=""
112 DATA_SEGMENT_END=""
113 if test -n "${COMMONPAGESIZE}"; then
114 DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
115 DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
116 DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT-0}, .);"
117 fi
118 if test -z "${INITIAL_READONLY_SECTIONS}${CREATE_SHLIB}"; then
119 INITIAL_READONLY_SECTIONS=".interp ${RELOCATING-0} : { *(.interp) }"
120 fi
121 if test -z "$PLT"; then
122 PLT=".plt ${RELOCATING-0} : { *(.plt) }"
123 fi
124 test -n "${DATA_PLT-${BSS_PLT-text}}" && TEXT_PLT=yes
125 if test -z "$GOT"; then
126 if test -z "$SEPARATE_GOTPLT"; then
127 GOT=".got ${RELOCATING-0} : { *(.got.plt) *(.got) }"
128 else
129 GOT=".got ${RELOCATING-0} : { *(.got) }"
130 GOTPLT=".got.plt ${RELOCATING-0} : { *(.got.plt) }"
131 fi
132 fi
133 DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }"
134 RODATA=".rodata ${RELOCATING+ADDR(.data)+SIZEOF(.data)} ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) } /*> INTERNAL_RAM*/"
135 DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }"
136 DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }"
137 if test -z "${NO_SMALL_DATA}"; then
138 SBSS=".sbss ${RELOCATING-0} :
139 {
140 ${RELOCATING+${SBSS_START_SYMBOLS}}
141 ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)}
142 *(.dynsbss)
143 *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
144 *(.scommon)
145 ${RELOCATING+${SBSS_END_SYMBOLS}}
146 }"
147 SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
148 SDATA="/* We want the small data sections together, so single-instruction offsets
149 can access them all, and initialized data all before uninitialized, so
150 we can shorten the on-disk segment size. */
151 .sdata ${RELOCATING-0} :
152 {
153 ${RELOCATING+${SDATA_START_SYMBOLS}}
154 ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)}
155 *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
156 }"
157 SDATA2=".sdata2 ${RELOCATING-0} :
158 {
159 ${RELOCATING+${SDATA2_START_SYMBOLS}}
160 *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*})
161 }"
162 REL_SDATA=".rel.sdata ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
163 .rela.sdata ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
164 REL_SBSS=".rel.sbss ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
165 .rela.sbss ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }"
166 REL_SDATA2=".rel.sdata2 ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) }
167 .rela.sdata2 ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }"
168 REL_SBSS2=".rel.sbss2 ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) }
169 .rela.sbss2 ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }"
170 else
171 NO_SMALL_DATA=" "
172 fi
173 if test -z "${DATA_GOT}"; then
174 if test -n "${NO_SMALL_DATA}"; then
175 DATA_GOT=" "
176 fi
177 fi
178 if test -z "${SDATA_GOT}"; then
179 if test -z "${NO_SMALL_DATA}"; then
180 SDATA_GOT=" "
181 fi
182 fi
183 test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
184 test "${LARGE_SECTIONS}" = "yes" && REL_LARGE="
185 .rel.ldata ${RELOCATING-0} : { *(.rel.ldata${RELOCATING+ .rel.ldata.* .rel.gnu.linkonce.l.*}) }
186 .rela.ldata ${RELOCATING-0} : { *(.rela.ldata${RELOCATING+ .rela.ldata.* .rela.gnu.linkonce.l.*}) }
187 .rel.lbss ${RELOCATING-0} : { *(.rel.lbss${RELOCATING+ .rel.lbss.* .rel.gnu.linkonce.lb.*}) }
188 .rela.lbss ${RELOCATING-0} : { *(.rela.lbss${RELOCATING+ .rela.lbss.* .rela.gnu.linkonce.lb.*}) }
189 .rel.lrodata ${RELOCATING-0} : { *(.rel.lrodata${RELOCATING+ .rel.lrodata.* .rel.gnu.linkonce.lr.*}) }
190 .rela.lrodata ${RELOCATING-0} : { *(.rela.lrodata${RELOCATING+ .rela.lrodata.* .rela.gnu.linkonce.lr.*}) }"
191 test "${LARGE_SECTIONS}" = "yes" && OTHER_BSS_SECTIONS="
192 ${OTHER_BSS_SECTIONS}
193 .lbss ${RELOCATING-0} :
194 {
195 *(.dynlbss)
196 *(.lbss${RELOCATING+ .lbss.* .gnu.linkonce.lb.*})
197 *(LARGE_COMMON)
198 }"
199 test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
200 .lrodata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
201 {
202 *(.lrodata${RELOCATING+ .lrodata.* .gnu.linkonce.lr.*})
203 }
204 .ldata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
205 {
206 *(.ldata${RELOCATING+ .ldata.* .gnu.linkonce.l.*})
207 ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
208 }"
209 CTOR=".ctors ADDR(.text) + SIZEOF(.text) ${CONSTRUCTING-0} :
210 {
211 ${CONSTRUCTING+${CTOR_START}}
212 /* gcc uses crtbegin.o to find the start of
213 the constructors, so we make sure it is
214 first. Because this is a wildcard, it
215 doesn't matter if the user does not
216 actually link against crtbegin.o; the
217 linker won't look for a file to match a
218 wildcard. The wildcard also means that it
219 doesn't matter which directory crtbegin.o
220 is in. */
221
222 KEEP (*crtbegin.o(.ctors))
223 KEEP (*crtbegin?.o(.ctors))
224
225 /* We don't want to include the .ctor section from
226 the crtend.o file until after the sorted ctors.
227 The .ctor section from the crtend file contains the
228 end of ctors marker and it must be last */
229
230 KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
231 KEEP (*(SORT(.ctors.*)))
232 KEEP (*(.ctors))
233 ${CONSTRUCTING+${CTOR_END}}
234 } /*> INTERNAL_RAM*/"
235 DTOR=".dtors ADDR(.ctors) + SIZEOF(.ctors) ${CONSTRUCTING-0} :
236 {
237 ${CONSTRUCTING+${DTOR_START}}
238 KEEP (*crtbegin.o(.dtors))
239 KEEP (*crtbegin?.o(.dtors))
240 KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
241 KEEP (*(SORT(.dtors.*)))
242 KEEP (*(.dtors))
243 ${CONSTRUCTING+${DTOR_END}}
244 } /*> INTERNAL_RAM*/ "
245 STACK=" .stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
246 {
247 ${RELOCATING+___stack = .;}
248 *(.stack)
249 }"
250
251 # If this is for an embedded system, don't add SIZEOF_HEADERS.
252 if [ -z "$EMBEDDED" ]; then
253 test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS"
254 else
255 test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
256 fi
257
258 cat <<EOF
259 /* Copyright (C) 2014-2015 Free Software Foundation, Inc.
260
261 Copying and distribution of this script, with or without modification,
262 are permitted in any medium without royalty provided the copyright
263 notice and this notice are preserved. */
264
265 OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
266 "${LITTLE_OUTPUT_FORMAT}")
267 OUTPUT_ARCH(${OUTPUT_ARCH})
268 ${RELOCATING+ENTRY(${ENTRY})}
269
270 ${RELOCATING+${EXECUTABLE_SYMBOLS}}
271 ${RELOCATING+${INPUT_FILES}}
272 ${RELOCATING- /* For some reason, the Solaris linker makes bad executables
273 if gld -r is used and the intermediate file has sections starting
274 at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld
275 bug. But for now assigning the zero vmas works. */}
276
277
278
279 /* BSP specific*/
280 __PROG_SIZE_FOR_CORE__ = 1M;
281 __HEAP_SIZE_FOR_CORE__ = 1M;
282
283 __MAX_NUM_CORES_IN_ROWS__ = 4;
284 __MAX_NUM_CORES_IN_COLS__ = 4;
285
286 __FIRST_CORE_ROW_ = 0x20;
287 __FIRST_CORE_COL_ = 0x24;
288
289
290
291 PROVIDE (__CORE_ROW_ = __FIRST_CORE_ROW_);
292 PROVIDE (__CORE_COL_ = __FIRST_CORE_COL_);
293 /* generic don't touch */
294 /* used to calculated the slice address in the external memory*/
295 __CORE_NUM_ = (__CORE_ROW_ - __FIRST_CORE_ROW_ )* __MAX_NUM_CORES_IN_COLS__ + (__CORE_COL_ - __FIRST_CORE_COL_ ) ;
296
297
298 MEMORY
299 {
300 EXTERNAL_DRAM_0 (WXAI) : ORIGIN = 0x80000000, LENGTH = 0x1000000 /*.text, data, rodata, bss and .stack*/
301 EXTERNAL_DRAM_1 (WXAI) : ORIGIN = 0x81000000, LENGTH = 0x1000000 /*.heap */
302
303 EXTERNAL_SRAM (WXAI) : ORIGIN = 0x92000000, LENGTH = 8K /* small external RAM, used for testing*/
304
305 /* run time lib and crt0*/
306 RESERVED_CRT0_RAM (WXAI) : ORIGIN = 0, LENGTH = 0x400
307
308 /* user program, per bank usage */
309 BANK0_SRAM (WXAI) : ORIGIN = LENGTH(RESERVED_CRT0_RAM), LENGTH = 8K - LENGTH(RESERVED_CRT0_RAM)
310 BANK1_SRAM (WXAI) : ORIGIN = 0x2000, LENGTH = 8K
311 BANK2_SRAM (WXAI) : ORIGIN = 0x4000, LENGTH = 8K
312 BANK3_SRAM (WXAI) : ORIGIN = 0x6000, LENGTH = 8K
313
314 /* user program, continious placement */
315 INTERNAL_RAM (WXAI) : ORIGIN = LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K - LENGTH(RESERVED_CRT0_RAM)
316
317 MMR (WAI) : ORIGIN = 0xF000, LENGTH = 32K
318
319 /* multi cores space */
320 CORE_0x20_0x24_INTERNAL_RAM : ORIGIN = 0x82400000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
321 CORE_0x20_0x25_INTERNAL_RAM : ORIGIN = 0x82500000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
322 CORE_0x20_0x26_INTERNAL_RAM : ORIGIN = 0x82600000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
323 CORE_0x20_0x27_INTERNAL_RAM : ORIGIN = 0x82700000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
324 CORE_0x21_0x24_INTERNAL_RAM : ORIGIN = 0x86400000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
325 CORE_0x21_0x25_INTERNAL_RAM : ORIGIN = 0x86500000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
326 CORE_0x21_0x26_INTERNAL_RAM : ORIGIN = 0x86600000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
327 CORE_0x21_0x27_INTERNAL_RAM : ORIGIN = 0x86700000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
328 CORE_0x22_0x24_INTERNAL_RAM : ORIGIN = 0x8a400000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
329 CORE_0x22_0x25_INTERNAL_RAM : ORIGIN = 0x8a500000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
330 CORE_0x22_0x26_INTERNAL_RAM : ORIGIN = 0x8a600000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
331 CORE_0x22_0x27_INTERNAL_RAM : ORIGIN = 0x8a700000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
332 CORE_0x23_0x24_INTERNAL_RAM : ORIGIN = 0x8e400000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
333 CORE_0x23_0x25_INTERNAL_RAM : ORIGIN = 0x8e500000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
334 CORE_0x23_0x26_INTERNAL_RAM : ORIGIN = 0x8e600000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
335 CORE_0x23_0x27_INTERNAL_RAM : ORIGIN = 0x8e700000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
336 CORE_0x24_0x24_INTERNAL_RAM : ORIGIN = 0x82000000+LENGTH(RESERVED_CRT0_RAM), LENGTH = 32K- LENGTH(RESERVED_CRT0_RAM)
337
338 }
339
340
341 SECTIONS
342 {
343
344 IVT 0 : {*.o(IVT) } > RESERVED_CRT0_RAM
345 RESERVED_CRT0 : {*.o(RESERVED_CRT0) } > RESERVED_CRT0_RAM
346 RESERVED_CRT0 : {*.o(reserved_crt0) } > RESERVED_CRT0_RAM
347
348 CORE_RAM_0 : {*.o(core_ram_0) } > BANK0_SRAM
349 CORE_RAM_1 : {*.o(core_ram_1) } > BANK1_SRAM
350 CORE_RAM_2 : {*.o(core_ram_2) } > BANK2_SRAM
351 CORE_RAM_3 : {*.o(core_ram_3) } > BANK3_SRAM
352
353 SRAM_SOUTH : {*.o(sram) } > EXTERNAL_SRAM
354 DRAM_WEST : {*.o(dram) } > EXTERNAL_DRAM_1
355
356 CORE_INTERNAL : {*.o(core_ram_internal) } /*> INTERNAL_RAM*/
357
358 /* the newlib (libc and libm) library is maped to the dedicated section */
359
360 __new_lib_start_external_ = ( ORIGIN(EXTERNAL_DRAM_0) + __PROG_SIZE_FOR_CORE__ *__CORE_NUM_ );
361 __new_lib_start_ = DEFINED(__USE_INTERNAL_MEM_FOR_NEW_LIB_) ? ORIGIN(BANK1_SRAM) : __new_lib_start_external_ ;
362
363 NEW_LIB_RO ${RELOCATING+__new_lib_start_} : { lib_a-*.o(.text .rodata ) *.o(libgloss_epiphany) } /* > INTERNAL_RAM*/
364 GNU_C_BUILTIN_LIB_RO ADDR(NEW_LIB_RO) + SIZEOF(NEW_LIB_RO) : {
365 *mulsi3.o(.text .rodata) *modsi3.o(.text .rodata)
366 *divsi3.o(.text .rodata) *udivsi3.o(.text .rodata)
367 *umodsi3.o(.text .rodata) _*.o(.text .rodata)
368 }
369
370 NEW_LIB_WR ADDR(GNU_C_BUILTIN_LIB_RO) + SIZEOF(GNU_C_BUILTIN_LIB_RO) : { lib_a-*.o(.data ) } /* > INTERNAL_RAM*/
371
372
373 __init_start = DEFINED(__USE_INTERNAL_MEM_) ? ORIGIN(BANK1_SRAM) : (ADDR(NEW_LIB_WR) + SIZEOF(NEW_LIB_WR) ) ;
374 __init_start = DEFINED(__USE_INTERNAL_MEM_FOR_NEW_LIB_) ? ADDR(NEW_LIB_WR) + SIZEOF(NEW_LIB_WR) : __init_start;
375
376
377 /* Read-only sections, merged into text segment: */
378 /*${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}*/
379 ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
380 ${CREATE_PIE+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR:-0} + SIZEOF_HEADERS;}}
381 ${INITIAL_READONLY_SECTIONS}
382 .note.gnu.build-id : { *(.note.gnu.build-id) }
383 EOF
384
385 test -n "${RELOCATING+0}" || unset NON_ALLOC_DYN
386 test -z "${NON_ALLOC_DYN}" || TEXT_DYNAMIC=
387 cat > ldscripts/dyntmp.$$ <<EOF
388 ${TEXT_DYNAMIC+${DYNAMIC}}
389 .hash ${RELOCATING-0} : { *(.hash) }
390 .gnu.hash ${RELOCATING-0} : { *(.gnu.hash) }
391 .dynsym ${RELOCATING-0} : { *(.dynsym) }
392 .dynstr ${RELOCATING-0} : { *(.dynstr) }
393 .gnu.version ${RELOCATING-0} : { *(.gnu.version) }
394 .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) }
395 .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) }
396 EOF
397
398 if [ "x$COMBRELOC" = x ]; then
399 COMBRELOCCAT="cat >> ldscripts/dyntmp.$$"
400 else
401 COMBRELOCCAT="cat > $COMBRELOC"
402 fi
403 eval $COMBRELOCCAT <<EOF
404 .rel.init ${RELOCATING-0} : { *(.rel.init) }
405 .rela.init ${RELOCATING-0} : { *(.rela.init) }
406 .rel.text ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
407 .rela.text ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
408 .rel.fini ${RELOCATING-0} : { *(.rel.fini) }
409 .rela.fini ${RELOCATING-0} : { *(.rela.fini) }
410 .rel.rodata ${RELOCATING-0} : { *(.rel.rodata${RELOCATING+ .rel.rodata.* .rel.gnu.linkonce.r.*}) }
411 .rela.rodata ${RELOCATING-0} : { *(.rela.rodata${RELOCATING+ .rela.rodata.* .rela.gnu.linkonce.r.*}) }
412 ${OTHER_READONLY_RELOC_SECTIONS}
413 .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+* .rel.gnu.linkonce.d.rel.ro.*}) }
414 .rela.data.rel.ro ${RELOCATING-0} : { *(.rela.data.rel.ro${RELOCATING+* .rela.gnu.linkonce.d.rel.ro.*}) }
415 .rel.data ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
416 .rela.data ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
417 .rel.tdata ${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
418 .rela.tdata ${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
419 .rel.tbss ${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
420 .rela.tbss ${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
421 .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
422 .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
423 .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
424 .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
425 .rel.got ${RELOCATING-0} : { *(.rel.got) }
426 .rela.got ${RELOCATING-0} : { *(.rela.got) }
427 ${OTHER_GOT_RELOC_SECTIONS}
428 ${REL_SDATA}
429 ${REL_SBSS}
430 ${REL_SDATA2}
431 ${REL_SBSS2}
432 .rel.bss ${RELOCATING-0} : { *(.rel.bss${RELOCATING+ .rel.bss.* .rel.gnu.linkonce.b.*}) }
433 .rela.bss ${RELOCATING-0} : { *(.rela.bss${RELOCATING+ .rela.bss.* .rela.gnu.linkonce.b.*}) }
434 ${REL_LARGE}
435 EOF
436
437 if [ -n "$COMBRELOC" ]; then
438 cat >> ldscripts/dyntmp.$$ <<EOF
439 .rel.dyn ${RELOCATING-0} :
440 {
441 EOF
442 sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rela\./d;s/^.*: { *\(.*\)}$/ \1/' $COMBRELOC >> ldscripts/dyntmp.$$
443 cat >> ldscripts/dyntmp.$$ <<EOF
444 }
445 .rela.dyn ${RELOCATING-0} :
446 {
447 EOF
448 sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rel\./d;s/^.*: { *\(.*\)}/ \1/' $COMBRELOC >> ldscripts/dyntmp.$$
449 cat >> ldscripts/dyntmp.$$ <<EOF
450 }
451 EOF
452 fi
453
454 cat >> ldscripts/dyntmp.$$ <<EOF
455 .rel.plt ${RELOCATING-0} : { *(.rel.plt) }
456 .rela.plt ${RELOCATING-0} : { *(.rela.plt) }
457 ${OTHER_PLT_RELOC_SECTIONS}
458 EOF
459
460 if test -z "${NON_ALLOC_DYN}"; then
461 if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
462 cat ldscripts/dyntmp.$$
463 else
464 if test -z "${NO_REL_RELOCS}"; then
465 sed -e '/^[ ]*\.rela\.[^}]*$/,/}/d' -e '/^[ ]*\.rela\./d' ldscripts/dyntmp.$$
466 fi
467 if test -z "${NO_RELA_RELOCS}"; then
468 sed -e '/^[ ]*\.rel\.[^}]*$/,/}/d' -e '/^[ ]*\.rel\./d' ldscripts/dyntmp.$$
469 fi
470 fi
471 rm -f ldscripts/dyntmp.$$
472 fi
473
474 cat <<EOF
475
476 .init __init_start :
477 {
478 ${RELOCATING+${INIT_START}}
479 KEEP (*(.init))
480 ${RELOCATING+${INIT_END}}
481 } /*> INTERNAL_RAM*/ =${NOP-0}
482
483 ${TEXT_PLT+${PLT}}
484 ${TINY_READONLY_SECTION}
485
486 .fini ${RELOCATING+ADDR(.init)+SIZEOF(.init)} ${RELOCATING-0} :
487 {
488 ${RELOCATING+${FINI_START}}
489 KEEP (*(.fini))
490 ${RELOCATING+${FINI_END}}
491 } /*> INTERNAL_RAM*/ =${NOP-0}
492
493 .text ${RELOCATING+ADDR(.fini)+SIZEOF(.fini)} ${RELOCATING-0} :
494 {
495 ${RELOCATING+${TEXT_START_SYMBOLS}}
496 *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
497 /* .gnu.warning sections are handled specially by elf32.em. */
498 *(.gnu.warning)
499 ${RELOCATING+${OTHER_TEXT_SECTIONS}}
500 } /*> INTERNAL_RAM */ =${NOP-0}
501
502 ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
503 ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
504 ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
505 ${WRITABLE_RODATA-${RODATA}}
506 .rodata1 ${RELOCATING-0} : { *(.rodata1) }
507 ${CREATE_SHLIB-${SDATA2}}
508 ${CREATE_SHLIB-${SBSS2}}
509 ${OTHER_READONLY_SECTIONS}
510 .eh_frame_hdr : { *(.eh_frame_hdr) }
511 .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
512 .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
513
514 /* Adjust the address for the data segment. We want to adjust up to
515 the same address within the page on the next page up. */
516 ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
517 ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
518 ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
519
520 /* Exception handling */
521 .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
522 .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
523
524 /* Thread Local Storage sections */
525 .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
526 .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
527
528 .preinit_array ${RELOCATING-0} :
529 {
530 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}}
531 KEEP (*(.preinit_array))
532 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}}
533 }
534 .init_array ${RELOCATING-0} :
535 {
536 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}}
537 KEEP (*(SORT(.init_array.*)))
538 KEEP (*(.init_array))
539 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}}
540 }
541 .fini_array ${RELOCATING-0} :
542 {
543 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}}
544 KEEP (*(.fini_array))
545 KEEP (*(SORT(.fini_array.*)))
546 ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}}
547 }
548 ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
549 ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
550 .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) }
551
552 ${RELOCATING+${DATARELRO}}
553 ${OTHER_RELRO_SECTIONS}
554 ${TEXT_DYNAMIC-${DYNAMIC}}
555 ${DATA_GOT+${RELRO_NOW+${GOT}}}
556 ${DATA_GOT+${RELRO_NOW+${GOTPLT}}}
557 ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${GOT}}}}
558 ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
559 ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${GOT}}}}
560 ${DATA_GOT+${RELRO_NOW-${GOTPLT}}}
561
562 ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
563
564 .data ${RELOCATING+ADDR(.dtors)+SIZEOF(.dtors)} ${RELOCATING-0} :
565 {
566 ${RELOCATING+${DATA_START_SYMBOLS}}
567 *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
568 ${CONSTRUCTING+SORT(CONSTRUCTORS)}
569 } /*> INTERNAL_RAM*/
570 .data1 ${RELOCATING-0} : { *(.data1) }
571 ${WRITABLE_RODATA+${RODATA}}
572 ${OTHER_READWRITE_SECTIONS}
573 ${SMALL_DATA_CTOR+${RELOCATING+${CTOR}}}
574 ${SMALL_DATA_DTOR+${RELOCATING+${DTOR}}}
575 ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
576 ${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS}}}
577 ${SDATA_GOT+${GOT}}
578 ${SDATA_GOT+${OTHER_GOT_SECTIONS}}
579 ${SDATA}
580 ${OTHER_SDATA_SECTIONS}
581 ${RELOCATING+${DATA_END_SYMBOLS-${USER_LABEL_PREFIX}_edata = .; PROVIDE (${USER_LABEL_PREFIX}edata = .);}}
582 /* Align ___bss_start and _end to a multiple of 8 so that we can use strd
583 to clear bss. N.B., without adding any extra alignment, we would have
584 to clear the bss byte by byte. */
585 ${RELOCATING+. = ALIGN(8);}
586 ${RELOCATING+___bss_start = .;}
587 ${RELOCATING+${OTHER_BSS_SYMBOLS}}
588 ${SBSS}
589 ${BSS_PLT+${PLT}}
590 .bss ${RELOCATING+ADDR(.rodata)+SIZEOF(.rodata)} ${RELOCATING-0} :
591 {
592 *(.dynbss)
593 *(.bss${RELOCATING+ .bss.* .gnu.linkonce.b.*})
594 *(COMMON)
595 /* Align here to ensure that the .bss section occupies space up to
596 _end. Align after .bss to ensure correct alignment even if the
597 .bss section disappears because there are no input sections.
598 FIXME: Why do we need it? When there is no .bss section, we don't
599 pad the .data section. */
600 ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
601 } /*> INTERNAL_RAM*/
602 ${OTHER_BSS_SECTIONS}
603 ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
604 ${RELOCATING+. = ALIGN(${ALIGNMENT});}
605 ${LARGE_SECTIONS}
606 ${RELOCATING+. = ALIGN(${ALIGNMENT});}
607 ${RELOCATING+. = ALIGN(8);}
608 ${RELOCATING+${OTHER_END_SYMBOLS}}
609 ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; PROVIDE (${USER_LABEL_PREFIX}end = .);}}
610 ${RELOCATING+${DATA_SEGMENT_END}}
611 EOF
612
613 if test -n "${NON_ALLOC_DYN}"; then
614 if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
615 cat ldscripts/dyntmp.$$
616 else
617 if test -z "${NO_REL_RELOCS}"; then
618 sed -e '/^[ ]*\.rela\.[^}]*$/,/}/d' -e '/^[ ]*\.rela\./d' ldscripts/dyntmp.$$
619 fi
620 if test -z "${NO_RELA_RELOCS}"; then
621 sed -e '/^[ ]*\.rel\.[^}]*$/,/}/d' -e '/^[ ]*\.rel\./d' ldscripts/dyntmp.$$
622 fi
623 fi
624 rm -f ldscripts/dyntmp.$$
625 fi
626
627 cat <<EOF
628 /* Stabs debugging sections. */
629 .stab 0 : { *(.stab) }
630 .stabstr 0 : { *(.stabstr) }
631 .stab.excl 0 : { *(.stab.excl) }
632 .stab.exclstr 0 : { *(.stab.exclstr) }
633 .stab.index 0 : { *(.stab.index) }
634 .stab.indexstr 0 : { *(.stab.indexstr) }
635
636 .comment 0 : { *(.comment) }
637
638 EOF
639
640 . $srcdir/scripttempl/DWARF.sc
641
642 cat <<EOF
643 ${TINY_DATA_SECTION}
644 ${TINY_BSS_SECTION}
645
646 /*${STACK_ADDR+${STACK}}*/
647
648 PROVIDE ( __stack_start_ = ORIGIN(EXTERNAL_DRAM_0) + __PROG_SIZE_FOR_CORE__ * __CORE_NUM_ + __PROG_SIZE_FOR_CORE__ - 0x10) ;
649 .stack ${RELOCATING+__stack_start_} : { ___stack = .; *(.stack) }
650
651 PROVIDE ( ___heap_start = ORIGIN(EXTERNAL_DRAM_1) + __HEAP_SIZE_FOR_CORE__ * __CORE_NUM_ );
652 /*.heap_start __heap_start_ : { _heap_start_ = .; *(.heap_start) }*/
653
654 PROVIDE ( ___heap_end = ORIGIN(EXTERNAL_DRAM_1) + __HEAP_SIZE_FOR_CORE__ * __CORE_NUM_ + __HEAP_SIZE_FOR_CORE__ - 4 );
655
656
657 /* .heap_end __heap_end_ : { _heap_end_ = .; *(.heap_end) }*/
658
659
660 ${ATTRS_SECTIONS}
661 ${OTHER_SECTIONS}
662 ${RELOCATING+${OTHER_SYMBOLS}}
663 ${RELOCATING+${DISCARDED}}
664 }
665 EOF