Added support for v4.2 boards
[SCSI2SD.git] / software / SCSI2SD / v4 / SCSI2SD.cydsn / Generated_Source / PSoC5 / cm3gcc.ld
1 /* Linker script for ARM M-profile Simulator
2  *
3  * Version: Sourcery G++ Lite 2010q1-188
4  * Support: https://support.codesourcery.com/GNUToolchain/
5  *
6  * Copyright (c) 2007, 2008, 2009, 2010 CodeSourcery, Inc.
7  *
8  * The authors hereby grant permission to use, copy, modify, distribute,
9  * and license this software and its documentation for any purpose, provided
10  * that existing copyright notices are retained in all copies and that this
11  * notice is included verbatim in any distributions.  No written agreement,
12  * license, or royalty fee is required for any of the authorized uses.
13  * Modifications to this software may be copyrighted by their authors
14  * and need not follow the licensing terms described here, provided that
15  * the new terms are clearly indicated on the first page of each file where
16  * they apply.
17  */
18 OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
19 ENTRY(__cy_reset)
20 SEARCH_DIR(.)
21 GROUP(-lgcc -lc -lnosys)
22
23
24 MEMORY
25 {
26   rom (rx) : ORIGIN = 0x0, LENGTH = 131072
27   ram (rwx) : ORIGIN = 0x20000000 - (32768 / 2), LENGTH = 32768
28 }
29
30
31 CY_APPL_ORIGIN      = 0; 
32 CY_FLASH_ROW_SIZE   = 256;
33 CY_ECC_ROW_SIZE     = 32;
34 CY_EE_IN_BTLDR      = 0x00;
35 CY_APPL_LOADABLE    = 1;
36 CY_EE_SIZE          = 2048;
37 CY_APPL_NUM         = 1;
38 CY_APPL_MAX         = 1;
39 CY_METADATA_SIZE    = 64;
40
41
42 /* These force the linker to search for particular symbols from
43  * the start of the link process and thus ensure the user's
44  * overrides are picked up
45  */
46 EXTERN(Reset)
47
48 /* Bring in the interrupt routines & vector */
49 EXTERN(main)
50
51 /* Bring in the meta data */
52 EXTERN(cy_meta_loader cy_bootloader cy_meta_loadable cy_meta_bootloader)
53 EXTERN(cy_meta_custnvl cy_meta_wolatch cy_meta_flashprotect cy_metadata)
54
55 /* Provide fall-back values */
56 PROVIDE(__cy_heap_start = _end);
57 PROVIDE(__cy_region_num = (__cy_regions_end - __cy_regions) / 16);
58 PROVIDE(__cy_stack = ORIGIN(ram) + LENGTH(ram));
59 PROVIDE(__cy_heap_end = __cy_stack - 0x4000);
60
61
62 SECTIONS
63 {
64   /* The bootloader location */
65   .cybootloader 0x0 : { KEEP(*(.cybootloader)) } >rom
66
67   /* Calculate where the loadables should start */
68   appl1_start   = CY_APPL_ORIGIN ? CY_APPL_ORIGIN : ALIGN(CY_FLASH_ROW_SIZE);
69   appl2_start   = appl1_start + ALIGN((LENGTH(rom) - appl1_start - 2 * CY_FLASH_ROW_SIZE) / 2, CY_FLASH_ROW_SIZE);
70   appl_start    = (CY_APPL_NUM == 1) ? appl1_start : appl2_start;
71   ecc_offset    = (appl_start / CY_FLASH_ROW_SIZE) * CY_ECC_ROW_SIZE;
72   ee_offset     = (CY_APPL_LOADABLE && !CY_EE_IN_BTLDR) ? ((CY_EE_SIZE / CY_APPL_MAX) * (CY_APPL_NUM - 1)) : 0;
73   ee_size       = (CY_APPL_LOADABLE && !CY_EE_IN_BTLDR) ? (CY_EE_SIZE / CY_APPL_MAX) : CY_EE_SIZE;
74   PROVIDE(CY_ECC_OFFSET = ecc_offset);
75   
76   .text appl_start :
77   {
78     CREATE_OBJECT_SYMBOLS
79     PROVIDE(__cy_interrupt_vector = RomVectors);
80
81     *(.romvectors)
82
83     /* Make sure we pulled in an interrupt vector.  */
84     ASSERT (. != __cy_interrupt_vector, "No interrupt vector");
85
86     ASSERT (CY_APPL_ORIGIN ? (SIZEOF(.cybootloader) <= CY_APPL_ORIGIN) : 1, "Wrong image location");
87
88     PROVIDE(__cy_reset = Reset);
89     *(.text.Reset)
90     /* Make sure we pulled in some reset code.  */
91     ASSERT (. != __cy_reset, "No reset code");
92
93         /* Place the DMA initialization before text to ensure it gets placed in first 64K of flash */
94     *(.dma_init)
95     ASSERT(appl_start + . <= 0x10000 || !0, "DMA Init must be within the first 64k of flash");
96                 
97     *(.text .text.* .gnu.linkonce.t.*)
98     *(.plt)
99     *(.gnu.warning)
100     *(.glue_7t) *(.glue_7) *(.vfp11_veneer)
101         
102     KEEP(*(.bootloader)) /* necessary for bootloader's, but doesn't impact non-bootloaders */
103
104     *(.ARM.extab* .gnu.linkonce.armextab.*)
105     *(.gcc_except_table)
106   } >rom
107   .eh_frame_hdr : ALIGN (4)
108   {
109     KEEP (*(.eh_frame_hdr))
110   } >rom
111   .eh_frame : ALIGN (4)
112   {
113     KEEP (*(.eh_frame))
114   } >rom
115   /* .ARM.exidx is sorted, so has to go in its own output section.  */
116   PROVIDE_HIDDEN (__exidx_start = .);
117   .ARM.exidx :
118   {
119     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
120   } >rom
121   __exidx_end = .;
122   .rodata : ALIGN (4)
123   {
124     *(.rodata .rodata.* .gnu.linkonce.r.*)
125
126     . = ALIGN(4);
127     KEEP(*(.init))
128
129     . = ALIGN(4);
130     __preinit_array_start = .;
131     KEEP (*(.preinit_array))
132     __preinit_array_end = .;
133
134     . = ALIGN(4);
135     __init_array_start = .;
136     KEEP (*(SORT(.init_array.*)))
137     KEEP (*(.init_array))
138     __init_array_end = .;
139
140     . = ALIGN(4);
141     KEEP(*(.fini))
142
143     . = ALIGN(4);
144     __fini_array_start = .;
145     KEEP (*(.fini_array))
146     KEEP (*(SORT(.fini_array.*)))
147     __fini_array_end = .;
148
149     . = ALIGN(0x4);
150     KEEP (*crtbegin.o(.ctors))
151     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
152     KEEP (*(SORT(.ctors.*)))
153     KEEP (*crtend.o(.ctors))
154
155     . = ALIGN(0x4);
156     KEEP (*crtbegin.o(.dtors))
157     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
158     KEEP (*(SORT(.dtors.*)))
159     KEEP (*crtend.o(.dtors))
160
161     . = ALIGN(4);
162     __cy_regions = .;
163     LONG (__cy_region_init_ram)
164     LONG (__cy_region_start_data)
165     LONG (__cy_region_init_size_ram)
166     LONG (__cy_region_zero_size_ram)
167     __cy_regions_end = .;
168
169     . = ALIGN (8);
170     _etext = .;
171   } >rom
172
173   .ramvectors (NOLOAD) : ALIGN(8)
174   {
175     __cy_region_start_ram = .;
176     KEEP(*(.ramvectors))
177   }
178
179   .noinit (NOLOAD) : ALIGN(8)
180   {
181     KEEP(*(.noinit))
182   }
183
184   .data : ALIGN(8)
185   {
186     __cy_region_start_data = .;
187
188     KEEP(*(.jcr))
189     *(.got.plt) *(.got)
190     *(.shdata)
191     *(.data .data.* .gnu.linkonce.d.*)
192     . = ALIGN (8);
193     *(.ram)
194     _edata = .;
195   } >ram AT>rom
196   .bss : ALIGN(8)
197   {
198     PROVIDE(__bss_start__ = .);
199     *(.shbss)
200     *(.bss .bss.* .gnu.linkonce.b.*)
201     *(COMMON)
202     . = ALIGN (8);
203     *(.ram.b)
204     _end = .;
205     __end = .;
206   } >ram AT>rom
207   PROVIDE(end = .);
208   PROVIDE(__bss_end__ = .);
209   
210   __cy_region_init_ram = LOADADDR (.data);
211   __cy_region_init_size_ram = _edata - ADDR (.data);
212   __cy_region_zero_size_ram = _end - _edata;
213   
214   /* The .stack and .heap sections don't contain any symbols. 
215    * They are only used for linker to calculate RAM utilization.
216    */
217   .heap (NOLOAD) :
218   {
219     . = _end;
220     . += 0x1000;
221     __cy_heap_limit = .;
222   } >ram
223
224   .stack (__cy_stack - 0x4000) (NOLOAD) :
225   {
226     __cy_stack_limit = .;
227     . += 0x4000;
228   } >ram
229   
230   /* Check if data + heap + stack exceeds RAM limit */
231   ASSERT(__cy_stack_limit >= __cy_heap_limit, "region RAM overflowed with stack")
232
233   .cyloadermeta ((appl_start == 0) ? (LENGTH(rom) - CY_METADATA_SIZE) : 0xF0000000) :
234   {
235     KEEP(*(.cyloadermeta))
236   } :NONE
237
238   .cyloadablemeta (LENGTH(rom) - CY_FLASH_ROW_SIZE * (CY_APPL_NUM - 1) - CY_METADATA_SIZE) :
239   {
240     KEEP(*(.cyloadablemeta))
241   } >rom
242
243   .cyconfigecc (0x80000000 + ecc_offset) : 
244   {
245     KEEP(*(.cyconfigecc))
246   } :NONE 
247
248   .cycustnvl      0x90000000 : { KEEP(*(.cycustnvl)) } :NONE 
249   .cywolatch      0x90100000 : { KEEP(*(.cywolatch)) } :NONE 
250
251   .cyeeprom (0x90200000 + ee_offset) : 
252   {
253     KEEP(*(.cyeeprom))
254     ASSERT(. <= (0x90200000 + ee_offset + ee_size), ".cyeeprom data will not fit in EEPROM");
255   } :NONE 
256
257   .cyflashprotect 0x90400000 : { KEEP(*(.cyflashprotect)) } :NONE 
258   .cymeta         0x90500000 : { KEEP(*(.cymeta)) } :NONE 
259
260   .stab 0 (NOLOAD) : { *(.stab) }
261   .stabstr 0 (NOLOAD) : { *(.stabstr) }
262   /* DWARF debug sections.
263    * Symbols in the DWARF debugging sections are relative to the beginning
264    * of the section so we begin them at 0.
265    */
266   /* DWARF 1 */
267   .debug          0 : { *(.debug) }
268   .line           0 : { *(.line) }
269   /* GNU DWARF 1 extensions */
270   .debug_srcinfo  0 : { *(.debug_srcinfo) }
271   .debug_sfnames  0 : { *(.debug_sfnames) }
272   /* DWARF 1.1 and DWARF 2 */
273   .debug_aranges  0 : { *(.debug_aranges) }
274   .debug_pubnames 0 : { *(.debug_pubnames) }
275   /* DWARF 2 */
276   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
277   .debug_abbrev   0 : { *(.debug_abbrev) }
278   .debug_line     0 : { *(.debug_line) }
279   .debug_frame    0 : { *(.debug_frame) }
280   .debug_str      0 : { *(.debug_str) }
281   .debug_loc      0 : { *(.debug_loc) }
282   .debug_macinfo  0 : { *(.debug_macinfo) }
283   /* DWARF 2.1 */
284   .debug_ranges   0 : { *(.debug_ranges) }
285   /* SGI/MIPS DWARF 2 extensions */
286   .debug_weaknames 0 : { *(.debug_weaknames) }
287   .debug_funcnames 0 : { *(.debug_funcnames) }
288   .debug_typenames 0 : { *(.debug_typenames) }
289   .debug_varnames  0 : { *(.debug_varnames) }
290
291   .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
292   .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
293   /DISCARD/ : { *(.note.GNU-stack) }
294 }
295