]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio/Source/SilLabs_Code/Device/SiliconLabs/EFM32GG/Source/GCC/efm32gg.ld
Add Pearl Gecko demo.
[freertos] / FreeRTOS / Demo / CORTEX_EFM32_Gecko_Starter_Kit_Simplicity_Studio / Source / SilLabs_Code / Device / SiliconLabs / EFM32GG / Source / GCC / efm32gg.ld
1 /* Linker script for Silicon Labs EFM32GG devices */\r
2 /*                                                                  */\r
3 /* This file is subject to the license terms as defined in ARM's    */\r
4 /* CMSIS END USER LICENSE AGREEMENT.pdf, governing the use of       */\r
5 /* Example Code.                                                    */\r
6 /*                                                                  */\r
7 /* Silicon Laboratories, Inc. 2015                                  */\r
8 /*                                                                  */\r
9 /* Version 4.2.0 */\r
10 /*                                                                  */\r
11 \r
12 MEMORY\r
13 {\r
14   FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576\r
15   RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 131072\r
16 }\r
17 \r
18 /* Linker script to place sections and symbol values. Should be used together\r
19  * with other linker script that defines memory regions FLASH and RAM.\r
20  * It references following symbols, which must be defined in code:\r
21  *   Reset_Handler : Entry of reset handler\r
22  *\r
23  * It defines following symbols, which code can use without definition:\r
24  *   __exidx_start\r
25  *   __exidx_end\r
26  *   __copy_table_start__\r
27  *   __copy_table_end__\r
28  *   __zero_table_start__\r
29  *   __zero_table_end__\r
30  *   __etext\r
31  *   __data_start__\r
32  *   __preinit_array_start\r
33  *   __preinit_array_end\r
34  *   __init_array_start\r
35  *   __init_array_end\r
36  *   __fini_array_start\r
37  *   __fini_array_end\r
38  *   __data_end__\r
39  *   __bss_start__\r
40  *   __bss_end__\r
41  *   __end__\r
42  *   end\r
43  *   __HeapLimit\r
44  *   __StackLimit\r
45  *   __StackTop\r
46  *   __stack\r
47  *   __Vectors_End\r
48  *   __Vectors_Size\r
49  */\r
50 ENTRY(Reset_Handler)\r
51 \r
52 SECTIONS\r
53 {\r
54   .text :\r
55   {\r
56     KEEP(*(.vectors))\r
57     __Vectors_End = .;\r
58     __Vectors_Size = __Vectors_End - __Vectors;\r
59     __end__ = .;\r
60 \r
61     *(.text*)\r
62 \r
63     KEEP(*(.init))\r
64     KEEP(*(.fini))\r
65 \r
66     /* .ctors */\r
67     *crtbegin.o(.ctors)\r
68     *crtbegin?.o(.ctors)\r
69     *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\r
70     *(SORT(.ctors.*))\r
71     *(.ctors)\r
72 \r
73     /* .dtors */\r
74     *crtbegin.o(.dtors)\r
75     *crtbegin?.o(.dtors)\r
76     *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\r
77     *(SORT(.dtors.*))\r
78     *(.dtors)\r
79 \r
80     *(.rodata*)\r
81 \r
82     KEEP(*(.eh_frame*))\r
83   } > FLASH\r
84 \r
85   .ARM.extab :\r
86   {\r
87     *(.ARM.extab* .gnu.linkonce.armextab.*)\r
88   } > FLASH\r
89 \r
90   __exidx_start = .;\r
91   .ARM.exidx :\r
92   {\r
93     *(.ARM.exidx* .gnu.linkonce.armexidx.*)\r
94   } > FLASH\r
95   __exidx_end = .;\r
96 \r
97   /* To copy multiple ROM to RAM sections,\r
98    * uncomment .copy.table section and,\r
99    * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\r
100   /*\r
101   .copy.table :\r
102   {\r
103     . = ALIGN(4);\r
104     __copy_table_start__ = .;\r
105     LONG (__etext)\r
106     LONG (__data_start__)\r
107     LONG (__data_end__ - __data_start__)\r
108     LONG (__etext2)\r
109     LONG (__data2_start__)\r
110     LONG (__data2_end__ - __data2_start__)\r
111     __copy_table_end__ = .;\r
112   } > FLASH\r
113   */\r
114 \r
115   /* To clear multiple BSS sections,\r
116    * uncomment .zero.table section and,\r
117    * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\r
118   /*\r
119   .zero.table :\r
120   {\r
121     . = ALIGN(4);\r
122     __zero_table_start__ = .;\r
123     LONG (__bss_start__)\r
124     LONG (__bss_end__ - __bss_start__)\r
125     LONG (__bss2_start__)\r
126     LONG (__bss2_end__ - __bss2_start__)\r
127     __zero_table_end__ = .;\r
128   } > FLASH\r
129   */\r
130 \r
131   __etext = .;\r
132 \r
133   .data : AT (__etext)\r
134   {\r
135     __data_start__ = .;\r
136     *(vtable)\r
137     *(.data*)\r
138     . = ALIGN (4);\r
139     *(.ram)\r
140 \r
141     . = ALIGN(4);\r
142     /* preinit data */\r
143     PROVIDE_HIDDEN (__preinit_array_start = .);\r
144     KEEP(*(.preinit_array))\r
145     PROVIDE_HIDDEN (__preinit_array_end = .);\r
146 \r
147     . = ALIGN(4);\r
148     /* init data */\r
149     PROVIDE_HIDDEN (__init_array_start = .);\r
150     KEEP(*(SORT(.init_array.*)))\r
151     KEEP(*(.init_array))\r
152     PROVIDE_HIDDEN (__init_array_end = .);\r
153 \r
154     . = ALIGN(4);\r
155     /* finit data */\r
156     PROVIDE_HIDDEN (__fini_array_start = .);\r
157     KEEP(*(SORT(.fini_array.*)))\r
158     KEEP(*(.fini_array))\r
159     PROVIDE_HIDDEN (__fini_array_end = .);\r
160 \r
161     KEEP(*(.jcr*))\r
162     . = ALIGN(4);\r
163     /* All data end */\r
164     __data_end__ = .;\r
165 \r
166   } > RAM\r
167 \r
168   .bss :\r
169   {\r
170     . = ALIGN(4);\r
171     __bss_start__ = .;\r
172     *(.bss*)\r
173     *(COMMON)\r
174     . = ALIGN(4);\r
175     __bss_end__ = .;\r
176   } > RAM\r
177 \r
178   .heap (COPY):\r
179   {\r
180     __HeapBase = .;\r
181     __end__ = .;\r
182     end = __end__;\r
183     _end = __end__;\r
184     KEEP(*(.heap*))\r
185     __HeapLimit = .;\r
186   } > RAM\r
187 \r
188   /* .stack_dummy section doesn't contains any symbols. It is only\r
189    * used for linker to calculate size of stack sections, and assign\r
190    * values to stack symbols later */\r
191   .stack_dummy (COPY):\r
192   {\r
193     KEEP(*(.stack*))\r
194   } > RAM\r
195 \r
196   /* Set stack top to end of RAM, and stack limit move down by\r
197    * size of stack_dummy section */\r
198   __StackTop = ORIGIN(RAM) + LENGTH(RAM);\r
199   __StackLimit = __StackTop - SIZEOF(.stack_dummy);\r
200   PROVIDE(__stack = __StackTop);\r
201 \r
202   /* Check if data + heap + stack exceeds RAM limit */\r
203   ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")\r
204 \r
205   /* Check if FLASH usage exceeds FLASH size */\r
206   ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")\r
207 }\r