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