OSDN Git Service

33c410538c54fa0df5b34cb06a866bb5277b95cf
[trx-305dsp/dsp.git] / trx305 / kernel / config / blackfin / _common_bf506 / bf506elf.ld
1 \r
2 OUTPUT_FORMAT("elf32-bfin","elf32-bfin","elf32-bfin")\r
3 OUTPUT_ARCH(bfin)\r
4 \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
10 \r
11 ENTRY (start);\r
12 \r
13 MEMORY\r
14   {\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
21 \r
22     MEM_FLASH (XR)    : ORIGIN = 0x20000000, LENGTH = 4M\r
23 \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
27 \r
28     MEM_L2              : ORIGIN = 0xffe00000, LENGTH = 0   /* DUMMY */\r
29 \r
30     MEM_SYSMMR (W!X)  : ORIGIN = 0xffc00000, LENGTH = 2M\r
31     MEM_COREMMR (W!X) : ORIGIN = 0xffe00000, LENGTH = 2M\r
32   }\r
33 \r
34 SECTIONS\r
35 {\r
36 \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
79   .l2             :\r
80   {\r
81     *(.l2 .l2.*)\r
82 /*  } >MEM_FLASH */\r
83   } >MEM_L1_CODE\r
84  \r
85   .start           :\r
86   {\r
87     KEEP (*(.start))\r
88   } >MEM_L1_CODE =0\r
89  \r
90   .text           :\r
91   {\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
95     *(.gnu.warning)\r
96   } >MEM_L1_CODE =0\r
97   \r
98   .init           :\r
99   {\r
100     KEEP (*(.init))\r
101   } >MEM_L1_CODE =0\r
102  \r
103   .plt            : { *(.plt) } >MEM_L1_CODE\r
104  \r
105   .fini           :\r
106   {\r
107     KEEP (*(.fini))\r
108   } >MEM_L1_CODE =0\r
109   \r
110   PROVIDE (__etext = .);\r
111   PROVIDE (_etext = .);\r
112   PROVIDE (etext = .);\r
113   \r
114   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >MEM_L1_DATA_A\r
115   .rodata1        : { *(.rodata1) } >MEM_L1_DATA_A\r
116   \r
117   .sdata2         :\r
118   {\r
119     *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)\r
120   } >MEM_L1_DATA_A\r
121   \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
126   \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
136   .preinit_array     :\r
137   {\r
138     PROVIDE_HIDDEN (___preinit_array_start = .);\r
139     KEEP (*(.preinit_array))\r
140     PROVIDE_HIDDEN (___preinit_array_end = .);\r
141   } >MEM_L1_DATA_A\r
142   .init_array     :\r
143   {\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
148   } >MEM_L1_DATA_A\r
149   .fini_array     :\r
150   {\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
155   } >MEM_L1_DATA_A\r
156 \r
157   .ctors          :\r
158   {\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
167        is in.  */\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
176   } >MEM_L1_DATA_A\r
177   .dtors          :\r
178   {\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
183   } >MEM_L1_DATA_A\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
187   .data           :\r
188   {\r
189     *(.data .data.* .gnu.linkonce.d.*)\r
190     KEEP (*(.gnu.linkonce.d.*personality*))\r
191     SORT(CONSTRUCTORS)\r
192   } >MEM_L1_DATA_A\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
198   .sdata          :\r
199   {\r
200     *(.sdata .sdata.* .gnu.linkonce.s.*)\r
201   } >MEM_L1_DATA_A\r
202   __edata = .; PROVIDE (_edata = .);\r
203   .sbss           :\r
204   {\r
205     __bss_start = .;\r
206     *(.dynsbss)\r
207     *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
208     *(.scommon)\r
209   } >MEM_L1_DATA_A\r
210   .bss            :\r
211   {\r
212     *(.dynbss)\r
213     *(.bss .bss.* .gnu.linkonce.b.*)\r
214     *(COMMON)\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
221     __bss_end = .;\r
222   } >MEM_L1_DATA_A\r
223   . = ALIGN(32 / 8);\r
224   . = ALIGN(32 / 8);\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
237   /* DWARF 1 */\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
246   /* DWARF 2 */\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
259 \r
260   __stack_end = ORIGIN(MEM_L1_SCRATCH) + LENGTH(MEM_L1_SCRATCH);\r
261 \r
262   __heap_start = ORIGIN(MEM_L1_DATA_A);\r
263   __heap_end = ORIGIN(MEM_L1_DATA_A) + LENGTH(MEM_L1_DATA_A);\r
264 \r
265     PROVIDE (end = .) ;\r
266 \r
267 }\r