1/**
2 * @file XMC4500x768.ld
3 * @date 2017-04-20
4 *
5 * @cond
6 *********************************************************************************************************************
7 * Linker file for the GNU C Compiler v1.8
8 * Supported devices: XMC4500-F144x768
9 *                    XMC4500-F100x768
10 *
11 * Copyright (c) 2015-2017, Infineon Technologies AG
12 * All rights reserved.
13 *
14 * Redistribution and use in source and binary forms, with or without modification,are permitted provided that the
15 * following conditions are met:
16 *
17 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
18 * disclaimer.
19 *
20 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials provided with the distribution.
22 *
23 * Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
24 * products derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
27 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE  FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
35 * Infineon Technologies AG dave@infineon.com).
36 *********************************************************************************************************************
37 *
38 * Change History
39 * --------------
40 *
41 * 2015-07-07:
42 *     - Product splitting
43 *     - Copyright notice update
44 *
45 * 2015-11-24:
46 *     - Compatibility with GCC 4.9 2015q2
47 *     - XMC4502 device gets its own linker file
48 *
49 * 2016-03-08:
50 *     - Fix size of BSS and DATA sections to be multiple of 4
51 *     - Add assertion to check that region DSRAM_1_system does not overflowed no_init section
52 *
53 * 2017-04-07:
54 *     - Added new symbols __text_size and eText
55 *
56 * 2017-04-20:
57 *     - Change vtable location to flash area to save ram
58 *
59 * @endcond
60 *
61 */
62
63OUTPUT_FORMAT("elf32-littlearm")
64OUTPUT_ARCH(arm)
65ENTRY(Reset_Handler)
66
67MEMORY
68{
69    FLASH_1_cached(RX) : ORIGIN = 0x08000000, LENGTH = 0xC0000
70    FLASH_1_uncached(RX) : ORIGIN = 0x0C000000, LENGTH = 0xC0000
71    PSRAM_1(!RX) : ORIGIN = 0x10000000, LENGTH = 0x10000
72    DSRAM_1_system(!RX) : ORIGIN = 0x20000000, LENGTH = 0x10000
73    DSRAM_2_comm(!RX) : ORIGIN = 0x30000000, LENGTH = 0x8000
74}
75
76stack_size = DEFINED(stack_size) ? stack_size : 2048;
77no_init_size = 64;
78
79SECTIONS
80{
81    /* TEXT section */
82
83    .text :
84    {
85        sText = .;
86        KEEP(*(.reset));
87        *(.text .text.* .gnu.linkonce.t.*);
88
89        /* C++ Support */
90        KEEP(*(.init))
91        KEEP(*(.fini))
92
93        /* .ctors */
94        *crtbegin.o(.ctors)
95        *crtbegin?.o(.ctors)
96        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
97        *(SORT(.ctors.*))
98        *(.ctors)
99
100        /* .dtors */
101        *crtbegin.o(.dtors)
102        *crtbegin?.o(.dtors)
103        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
104        *(SORT(.dtors.*))
105        *(.dtors)
106
107        *(.rodata .rodata.*)
108        *(.gnu.linkonce.r*)
109
110        *(vtable)
111
112        . = ALIGN(4);
113    } > FLASH_1_cached AT > FLASH_1_uncached
114
115    .eh_frame_hdr : ALIGN (4)
116    {
117      KEEP (*(.eh_frame_hdr))
118    } > FLASH_1_cached AT > FLASH_1_uncached
119
120    .eh_frame : ALIGN (4)
121    {
122      KEEP (*(.eh_frame))
123    } > FLASH_1_cached AT > FLASH_1_uncached
124
125    /* Exception handling, exidx needs a dedicated section */
126    .ARM.extab : ALIGN (4)
127    {
128        *(.ARM.extab* .gnu.linkonce.armextab.*)
129    } > FLASH_1_cached AT > FLASH_1_uncached
130
131    . = ALIGN(4);
132    __exidx_start = .;
133    .ARM.exidx : ALIGN (4)
134    {
135        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
136    } > FLASH_1_cached AT > FLASH_1_uncached
137    __exidx_end = .;
138    . = ALIGN(4);
139
140    /* DSRAM layout (Lowest to highest)*/
141
142    Stack (NOLOAD) :
143    {
144        __stack_start = .;
145        . = . + stack_size;
146        __stack_end = .;
147        __initial_sp = .;
148    } > PSRAM_1
149
150    /* functions with __attribute__((section(".ram_code"))) */
151    .ram_code :
152    {
153        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
154        __ram_code_start = .;
155        *(.ram_code)
156        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
157        __ram_code_end = .;
158    } > PSRAM_1 AT > FLASH_1_uncached
159    __ram_code_load = LOADADDR (.ram_code);
160    __ram_code_size = __ram_code_end - __ram_code_start;
161
162    PSRAM_DATA :
163    {
164        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
165        __data3_start = .;
166        *(PSRAM_DATA)
167        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
168        __data3_end = .;
169    } > PSRAM_1 AT > FLASH_1_uncached
170    __data3_load = LOADADDR (PSRAM_DATA);
171    __data3_size = __data3_end - __data3_start;
172
173    PSRAM_BSS (NOLOAD) :
174    {
175        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
176        __bss3_start = .;
177        *(PSRAM_BSS)
178        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
179        __bss3_end = .;
180        . = ALIGN(8);
181        Heap_Bank3_Start = .;
182    } > PSRAM_1
183    __bss3_size = __bss3_end - __bss3_start;
184
185    /* Standard DATA and user defined DATA/BSS/CONST sections */
186    .data :
187    {
188        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
189        __data_start = .;
190        * (.data);
191        * (.data*);
192        *(*.data);
193        *(.gnu.linkonce.d*)
194
195        . = ALIGN(4);
196        /* preinit data */
197        PROVIDE_HIDDEN (__preinit_array_start = .);
198        KEEP(*(.preinit_array))
199        PROVIDE_HIDDEN (__preinit_array_end = .);
200
201        . = ALIGN(4);
202        /* init data */
203        PROVIDE_HIDDEN (__init_array_start = .);
204        KEEP(*(SORT(.init_array.*)))
205        KEEP(*(.init_array))
206        PROVIDE_HIDDEN (__init_array_end = .);
207
208        . = ALIGN(4);
209        /* finit data */
210        PROVIDE_HIDDEN (__fini_array_start = .);
211        KEEP(*(SORT(.fini_array.*)))
212        KEEP(*(.fini_array))
213        PROVIDE_HIDDEN (__fini_array_end = .);
214
215        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
216        __data_end = .;
217    } > DSRAM_1_system AT > FLASH_1_uncached
218    __data_load = LOADADDR (.data);
219    __data_size = __data_end - __data_start;
220
221    /* BSS section */
222    .bss (NOLOAD) :
223    {
224        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
225        __bss_start = .;
226        * (.bss);
227        * (.bss*);
228        * (COMMON);
229        *(.gnu.linkonce.b*)
230        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
231        __bss_end = .;
232        . = ALIGN(8);
233        Heap_Bank1_Start = .;
234    } > DSRAM_1_system
235    __bss_size = __bss_end - __bss_start;
236
237    /* .no_init section contains chipid, SystemCoreClock and trimming data. See system.c file*/
238    .no_init ORIGIN(DSRAM_1_system) + LENGTH(DSRAM_1_system) - no_init_size (NOLOAD) :
239    {
240        Heap_Bank1_End = .;
241        * (.no_init);
242    } > DSRAM_1_system
243
244    DSRAM2_DATA :
245    {
246        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
247        __data2_start = .;
248        *(DSRAM2_DATA)
249        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
250        __data2_end = .;
251    } > DSRAM_2_comm AT > FLASH_1_uncached
252    __data2_load = LOADADDR(DSRAM2_DATA);
253    __data2_size = __data2_end - __data2_start;
254
255    __text_size = (__exidx_end - sText) + __data_size + __ram_code_size + __data2_size + __data3_size;
256    eText = sText + __text_size;
257
258    DSRAM2_BSS (NOLOAD) :
259    {
260        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
261        __bss2_start = .;
262        *(ETH_RAM)
263        *(USB_RAM)
264        *(DSRAM2_BSS)
265        . = ALIGN(4); /* section size must be multiply of 4. See startup.S file */
266        __bss2_end = .;
267        . = ALIGN(8);
268        Heap_Bank2_Start = .;
269    } > DSRAM_2_comm
270    __bss2_size = __bss2_end - __bss2_start;
271
272    Heap_Bank1_Size = Heap_Bank1_End - Heap_Bank1_Start;
273    Heap_Bank2_Size = LENGTH(DSRAM_2_comm) - (Heap_Bank2_Start - ORIGIN(DSRAM_2_comm));
274    Heap_Bank3_Size = LENGTH(PSRAM_1) - (Heap_Bank3_Start - ORIGIN(PSRAM_1));
275
276    ASSERT(Heap_Bank1_Start <= Heap_Bank1_End, "region SRAM_combined overflowed no_init section")
277
278    /DISCARD/ :
279    {
280        *(.comment)
281    }
282
283    .stab       0 (NOLOAD) : { *(.stab) }
284    .stabstr    0 (NOLOAD) : { *(.stabstr) }
285
286    /* DWARF 1 */
287    .debug              0 : { *(.debug) }
288    .line               0 : { *(.line) }
289
290    /* GNU DWARF 1 extensions */
291    .debug_srcinfo      0 : { *(.debug_srcinfo) }
292    .debug_sfnames      0 : { *(.debug_sfnames) }
293
294    /* DWARF 1.1 and DWARF 2 */
295    .debug_aranges      0 : { *(.debug_aranges) }
296    .debug_pubnames     0 : { *(.debug_pubnames) }
297    .debug_pubtypes     0 : { *(.debug_pubtypes) }
298
299    /* DWARF 2 */
300    .debug_info         0 : { *(.debug_info .gnu.linkonce.wi.*) }
301    .debug_abbrev       0 : { *(.debug_abbrev) }
302    .debug_line         0 : { *(.debug_line) }
303    .debug_frame        0 : { *(.debug_frame) }
304    .debug_str          0 : { *(.debug_str) }
305    .debug_loc          0 : { *(.debug_loc) }
306    .debug_macinfo      0 : { *(.debug_macinfo) }
307
308    /* DWARF 2.1 */
309    .debug_ranges       0 : { *(.debug_ranges) }
310
311    /* SGI/MIPS DWARF 2 extensions */
312    .debug_weaknames    0 : { *(.debug_weaknames) }
313    .debug_funcnames    0 : { *(.debug_funcnames) }
314    .debug_typenames    0 : { *(.debug_typenames) }
315    .debug_varnames     0 : { *(.debug_varnames) }
316
317    /* Build attributes */
318    .build_attributes   0 : { *(.ARM.attributes) }
319}
320