1/*
2 * Copyright (c) 2006-2022, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date			Author		Notes
8 * 2011-12-08	onelife		Initial creation for EFM3 giant gecko support
9 * 2012-05-15	onelife		Modified to compatible with CMSIS v3
10 */
11
12MEMORY
13{
14    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576
15    RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 131072
16}
17_system_stack_size = 0x200;
18
19/* Linker script to place sections and symbol values. Should be used together
20 * with other linker script that defines memory regions FLASH and RAM.
21 * It references following symbols, which must be defined in code:
22 *   Reset_Handler : Entry of reset handler
23 *
24 * It defines following symbols, which code can use without definition:
25 *   __exidx_start
26 *   __exidx_end
27 *   __etext
28 *   __data_start__
29 *   __preinit_array_start
30 *   __preinit_array_end
31 *   __init_array_start
32 *   __init_array_end
33 *   __fini_array_start
34 *   __fini_array_end
35 *   __data_end__
36 *   __bss_start__
37 *   __bss_end__
38 *   __end__
39 *   end
40 *   __HeapLimit
41 *   __StackLimit
42 *   __StackTop
43 *   __stack
44 */
45ENTRY(Reset_Handler)
46
47SECTIONS
48{
49	.text :
50	{
51		KEEP(*(.isr_vector))
52		*(.text*)
53
54		KEEP(*(.init))
55		KEEP(*(.fini))
56
57		/* .ctors */
58		*crtbegin.o(.ctors)
59		*crtbegin?.o(.ctors)
60		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
61		*(SORT(.ctors.*))
62		*(.ctors)
63
64		/* .dtors */
65 		*crtbegin.o(.dtors)
66 		*crtbegin?.o(.dtors)
67 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
68 		*(SORT(.dtors.*))
69 		*(.dtors)
70
71		*(.rodata*)
72
73		KEEP(*(.eh_frame*))
74
75		/* section information for finsh shell */
76		. = ALIGN(4);
77		__fsymtab_start = .;
78		KEEP(*(FSymTab))
79		__fsymtab_end = .;
80		. = ALIGN(4);
81		__vsymtab_start = .;
82		KEEP(*(VSymTab))
83		__vsymtab_end = .;
84	} > FLASH = 0
85
86	.ARM.extab :
87	{
88		*(.ARM.extab* .gnu.linkonce.armextab.*)
89	} > FLASH
90
91	__exidx_start = .;
92	.ARM.exidx :
93	{
94		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
95	} > FLASH
96	__exidx_end = .;
97
98	__etext = .;
99
100	.data : AT (__etext)
101	{
102		__data_start__ = .;
103		*(vtable)
104		*(.data*)
105		*(.ram)
106
107		. = ALIGN(4);
108		/* preinit data */
109		PROVIDE_HIDDEN (__preinit_array_start = .);
110		KEEP(*(.preinit_array))
111		PROVIDE_HIDDEN (__preinit_array_end = .);
112
113		. = ALIGN(4);
114		/* init data */
115		PROVIDE_HIDDEN (__init_array_start = .);
116		KEEP(*(SORT(.init_array.*)))
117		KEEP(*(.init_array))
118		PROVIDE_HIDDEN (__init_array_end = .);
119
120
121		. = ALIGN(4);
122		/* finit data */
123		PROVIDE_HIDDEN (__fini_array_start = .);
124		KEEP(*(SORT(.fini_array.*)))
125		KEEP(*(.fini_array))
126		PROVIDE_HIDDEN (__fini_array_end = .);
127
128		. = ALIGN(4);
129		/* All data end */
130		__data_end__ = .;
131
132	} > RAM
133
134	.bss :
135	{
136		__bss_start__ = .;
137		*(.bss*)
138		*(COMMON)
139		__bss_end__ = .;
140	} > RAM
141
142	.heap :
143	{
144		__end__ = .;
145		end = __end__;
146		_end = __end__;
147		*(.heap*)
148		__HeapLimit = .;
149	} > RAM
150
151	/* .stack_dummy section doesn't contains any symbols. It is only
152	 * used for linker to calculate size of stack sections, and assign
153	 * values to stack symbols later */
154	.stack_dummy :
155	{
156		*(.stack)
157	} > RAM
158
159	/* Set stack top to end of RAM, and stack limit move down by
160	 * size of stack_dummy section */
161	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
162	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
163	PROVIDE(__stack = __StackTop);
164
165	/* Check if data + heap + stack exceeds RAM limit */
166	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
167}
168