2 OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin")
\r
5 PROVIDE (ldf_stack_end = 0xffb00FFC ) ;
\r
6 PROVIDE (hardware_init_hook = 0) ;
\r
7 PROVIDE (software_init_hook = 0) ;
\r
8 PROVIDE (software_term_hook = 0) ;
\r
9 PROVIDE (__kernel_boot_for_gdb = 0);
\r
15 /* BF506は外部メモリが接続できないため、MEM_SDRAM/MEM_ASYNC_Xは削除する */
\r
16 /* MEM_SDRAM (XW) : ORIGIN = 0x00000000, LENGTH = 128M */
\r
17 /* MEM_ASYNC_0 (XW) : ORIGIN = 0x20000000, LENGTH = 1M */
\r
18 /* MEM_ASYNC_1 (XW) : ORIGIN = 0x20100000, LENGTH = 1M */
\r
19 /* MEM_ASYNC_2 (XW) : ORIGIN = 0x20200000, LENGTH = 1M */
\r
20 /* MEM_ASYNC_3 (XW) : ORIGIN = 0x20300000, LENGTH = 1M */
\r
22 MEM_FLASH (XR) : ORIGIN = 0x20000000, LENGTH = 4M
\r
24 MEM_L1_DATA_A (W!X) : ORIGIN = 0xff800000, LENGTH = 16K /* BF506のバンクAは32kBだが、キャッシュ用に16kBあけておく */
\r
25 MEM_L1_CODE (XR) : ORIGIN = 0xffa00000, LENGTH = 32K /* BF506のバンクAは32kBだが、キャッシュ用に16kBあけておく */
\r
26 MEM_L1_SCRATCH (W!X) : ORIGIN = 0xffb00000, LENGTH = 4K
\r
28 MEM_L2 : ORIGIN = 0xffe00000, LENGTH = 0 /* DUMMY */
\r
30 MEM_SYSMMR (W!X) : ORIGIN = 0xffc00000, LENGTH = 2M
\r
31 MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M
\r
37 /* Read-only sections, merged into text segment: */
\r
38 .interp : { *(.interp) }
\r
39 .hash : { *(.hash) }
\r
40 .dynsym : { *(.dynsym) }
\r
41 .dynstr : { *(.dynstr) }
\r
42 .gnu.version : { *(.gnu.version) }
\r
43 .gnu.version_d : { *(.gnu.version_d) }
\r
44 .gnu.version_r : { *(.gnu.version_r) }
\r
45 .rel.init : { *(.rel.init) }
\r
46 .rela.init : { *(.rela.init) }
\r
47 .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
\r
48 .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
\r
49 .rel.fini : { *(.rel.fini) }
\r
50 .rela.fini : { *(.rela.fini) }
\r
51 .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
\r
52 .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
\r
53 .rel.data.rel.ro : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
\r
54 .rela.data.rel.ro : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
\r
55 .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
\r
56 .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
\r
57 .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
\r
58 .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
\r
59 .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
\r
60 .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
\r
61 .rel.ctors : { *(.rel.ctors) }
\r
62 .rela.ctors : { *(.rela.ctors) }
\r
63 .rel.dtors : { *(.rel.dtors) }
\r
64 .rela.dtors : { *(.rela.dtors) }
\r
65 .rel.got : { *(.rel.got) }
\r
66 .rela.got : { *(.rela.got) }
\r
67 .rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) }
\r
68 .rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) }
\r
69 .rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) }
\r
70 .rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) }
\r
71 .rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) }
\r
72 .rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) }
\r
73 .rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) }
\r
74 .rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) }
\r
75 .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
\r
76 .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
\r
77 .rel.plt : { *(.rel.plt) }
\r
78 .rela.plt : { *(.rela.plt) }
\r
92 *(.text .stub .text.* .gnu.linkonce.t.*)
\r
93 KEEP (*(.text.*personality*))
\r
94 /* .gnu.warning sections are handled specially by elf32.em. */
\r
103 .plt : { *(.plt) } >MEM_L1_CODE
\r
110 PROVIDE (__etext = .);
\r
111 PROVIDE (_etext = .);
\r
112 PROVIDE (etext = .);
\r
114 .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A
\r
115 .rodata1 : { *(.rodata1) } >MEM_L1_DATA_A
\r
119 *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
\r
122 .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } >MEM_L1_DATA_A
\r
123 .eh_frame_hdr : { *(.eh_frame_hdr) } >MEM_L1_DATA_A
\r
124 .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A
\r
125 .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A
\r
127 /* Adjust the address for the data segment. We want to adjust up to
\r
128 the same address within the page on the next page up. */
\r
129 . = ALIGN(0x1000) + (. & (0x1000 - 1));
\r
130 /* Exception handling */
\r
131 .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >MEM_L1_DATA_A
\r
132 .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >MEM_L1_DATA_A
\r
133 /* Thread Local Storage sections */
\r
134 .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >MEM_L1_DATA_A
\r
135 .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >MEM_L1_DATA_A
\r
138 PROVIDE_HIDDEN (___preinit_array_start = .);
\r
139 KEEP (*(.preinit_array))
\r
140 PROVIDE_HIDDEN (___preinit_array_end = .);
\r
144 PROVIDE_HIDDEN (___init_array_start = .);
\r
145 KEEP (*(SORT(.init_array.*)))
\r
146 KEEP (*(.init_array))
\r
147 PROVIDE_HIDDEN (___init_array_end = .);
\r
151 PROVIDE_HIDDEN (___fini_array_start = .);
\r
152 KEEP (*(.fini_array))
\r
153 KEEP (*(SORT(.fini_array.*)))
\r
154 PROVIDE_HIDDEN (___fini_array_end = .);
\r
159 /* gcc uses crtbegin.o to find the start of
\r
160 the constructors, so we make sure it is
\r
161 first. Because this is a wildcard, it
\r
162 doesn't matter if the user does not
\r
163 actually link against crtbegin.o; the
\r
164 linker won't look for a file to match a
\r
165 wildcard. The wildcard also means that it
\r
166 doesn't matter which directory crtbegin.o
\r
168 KEEP (*crtbegin*.o(.ctors))
\r
169 /* We don't want to include the .ctor section from
\r
170 the crtend.o file until after the sorted ctors.
\r
171 The .ctor section from the crtend file contains the
\r
172 end of ctors marker and it must be last */
\r
173 KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
\r
174 KEEP (*(SORT(.ctors.*)))
\r
175 KEEP (*crtend*.o(.ctors))
\r
179 KEEP (*crtbegin*.o(.dtors))
\r
180 KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
\r
181 KEEP (*(SORT(.dtors.*)))
\r
182 KEEP (*crtend*.o(.dtors))
\r
184 .jcr : { KEEP (*(.jcr)) } >MEM_L1_DATA_A
\r
185 .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) } >MEM_L1_DATA_A
\r
186 .dynamic : { *(.dynamic) } >MEM_L1_DATA_A
\r
189 *(.data .data.* .gnu.linkonce.d.*)
\r
190 KEEP (*(.gnu.linkonce.d.*personality*))
\r
193 .data1 : { *(.data1) } >MEM_L1_DATA_A
\r
194 .got : { *(.got.plt) *(.got) } >MEM_L1_DATA_A
\r
195 /* We want the small data sections together, so single-instruction offsets
\r
196 can access them all, and initialized data all before uninitialized, so
\r
197 we can shorten the on-disk segment size. */
\r
200 *(.sdata .sdata.* .gnu.linkonce.s.*)
\r
202 __edata = .; PROVIDE (_edata = .);
\r
207 *(.sbss .sbss.* .gnu.linkonce.sb.*)
\r
213 *(.bss .bss.* .gnu.linkonce.b.*)
\r
215 /* Align here to ensure that the .bss section occupies space up to
\r
216 _end. Align after .bss to ensure correct alignment even if the
\r
217 .bss section disappears because there are no input sections.
\r
218 FIXME: Why do we need it? When there is no .bss section, we don't
\r
219 pad the .data section. */
\r
220 . = ALIGN(. != 0 ? 32 / 8 : 1);
\r
225 __end = .; PROVIDE (_end = .);
\r
226 /* Stabs debugging sections. */
\r
227 .stab 0 : { *(.stab) }
\r
228 .stabstr 0 : { *(.stabstr) }
\r
229 .stab.excl 0 : { *(.stab.excl) }
\r
230 .stab.exclstr 0 : { *(.stab.exclstr) }
\r
231 .stab.index 0 : { *(.stab.index) }
\r
232 .stab.indexstr 0 : { *(.stab.indexstr) }
\r
233 .comment 0 : { *(.comment) }
\r
234 /* DWARF debug sections.
\r
235 Symbols in the DWARF debugging sections are relative to the beginning
\r
236 of the section so we begin them at 0. */
\r
238 .debug 0 : { *(.debug) }
\r
239 .line 0 : { *(.line) }
\r
240 /* GNU DWARF 1 extensions */
\r
241 .debug_srcinfo 0 : { *(.debug_srcinfo) }
\r
242 .debug_sfnames 0 : { *(.debug_sfnames) }
\r
243 /* DWARF 1.1 and DWARF 2 */
\r
244 .debug_aranges 0 : { *(.debug_aranges) }
\r
245 .debug_pubnames 0 : { *(.debug_pubnames) }
\r
247 .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
\r
248 .debug_abbrev 0 : { *(.debug_abbrev) }
\r
249 .debug_line 0 : { *(.debug_line) }
\r
250 .debug_frame 0 : { *(.debug_frame) }
\r
251 .debug_str 0 : { *(.debug_str) }
\r
252 .debug_loc 0 : { *(.debug_loc) }
\r
253 .debug_macinfo 0 : { *(.debug_macinfo) }
\r
254 /* SGI/MIPS DWARF 2 extensions */
\r
255 .debug_weaknames 0 : { *(.debug_weaknames) }
\r
256 .debug_funcnames 0 : { *(.debug_funcnames) }
\r
257 .debug_typenames 0 : { *(.debug_typenames) }
\r
258 .debug_varnames 0 : { *(.debug_varnames) }
\r
260 __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH);
\r
262 __heap_start = ORIGIN(MEM_L1_DATA_A);
\r
263 __heap_end = ORIGIN(MEM_L1_DATA_A) + LENGTH(MEM_L1_DATA_A);
\r
265 PROVIDE (end = .) ;
\r