1/*
2  Copyright (c) 2014-2015 Arduino LLC.  All right reserved.
3
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12  See the GNU Lesser General Public License for more details.
13
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17*/
18
19/* Linker script to configure memory regions.
20 * Need modifying for a specific board.
21 *   FLASH.ORIGIN: starting address of flash
22 *   FLASH.LENGTH: length of flash
23 *   RAM.ORIGIN: starting address of RAM bank 0
24 *   RAM.LENGTH: length of RAM bank 0
25 */
26MEMORY
27{
28  FLASH (rx) : ORIGIN = 0x00000000+0x2000, LENGTH = 0x00040000-0x2000 /* First 8KB used by bootloader */
29  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
30}
31
32/* Linker script to place sections and symbol values. Should be used together
33 * with other linker script that defines memory regions FLASH and RAM.
34 * It references following symbols, which must be defined in code:
35 *   Reset_Handler : Entry of reset handler
36 *
37 * It defines following symbols, which code can use without definition:
38 *   __exidx_start
39 *   __exidx_end
40 *   __copy_table_start__
41 *   __copy_table_end__
42 *   __zero_table_start__
43 *   __zero_table_end__
44 *   __etext
45 *   __data_start__
46 *   __preinit_array_start
47 *   __preinit_array_end
48 *   __init_array_start
49 *   __init_array_end
50 *   __fini_array_start
51 *   __fini_array_end
52 *   __data_end__
53 *   __bss_start__
54 *   __bss_end__
55 *   __end__
56 *   end
57 *   __HeapLimit
58 *   __StackLimit
59 *   __StackTop
60 *   __stack
61 */
62ENTRY(Reset_Handler)
63
64SECTIONS
65{
66	.text :
67	{
68		__text_start__ = .;
69
70		KEEP(*(.sketch_boot))
71		. = ALIGN(0x2000);
72
73		KEEP(*(.isr_vector))
74		*(.text*)
75
76		KEEP(*(.init))
77		KEEP(*(.fini))
78
79		/* .ctors */
80		*crtbegin.o(.ctors)
81		*crtbegin?.o(.ctors)
82		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
83		*(SORT(.ctors.*))
84		*(.ctors)
85
86		/* .dtors */
87 		*crtbegin.o(.dtors)
88 		*crtbegin?.o(.dtors)
89 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
90 		*(SORT(.dtors.*))
91 		*(.dtors)
92
93		*(.rodata*)
94
95		KEEP(*(.eh_frame*))
96	} > FLASH
97
98	.ARM.extab :
99	{
100		*(.ARM.extab* .gnu.linkonce.armextab.*)
101	} > FLASH
102
103	__exidx_start = .;
104	.ARM.exidx :
105	{
106		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
107	} > FLASH
108	__exidx_end = .;
109
110	/* To copy multiple ROM to RAM sections,
111	 * uncomment .copy.table section and,
112	 * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
113	/*
114	.copy.table :
115	{
116		. = ALIGN(4);
117		__copy_table_start__ = .;
118		LONG (__etext)
119		LONG (__data_start__)
120		LONG (__data_end__ - __data_start__)
121		LONG (__etext2)
122		LONG (__data2_start__)
123		LONG (__data2_end__ - __data2_start__)
124		__copy_table_end__ = .;
125	} > FLASH
126	*/
127
128	/* To clear multiple BSS sections,
129	 * uncomment .zero.table section and,
130	 * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
131	/*
132	.zero.table :
133	{
134		. = ALIGN(4);
135		__zero_table_start__ = .;
136		LONG (__bss_start__)
137		LONG (__bss_end__ - __bss_start__)
138		LONG (__bss2_start__)
139		LONG (__bss2_end__ - __bss2_start__)
140		__zero_table_end__ = .;
141	} > FLASH
142	*/
143
144	__etext = .;
145
146	.data : AT (__etext)
147	{
148		__data_start__ = .;
149		*(vtable)
150		*(.data*)
151
152		. = ALIGN(4);
153		/* preinit data */
154		PROVIDE_HIDDEN (__preinit_array_start = .);
155		KEEP(*(.preinit_array))
156		PROVIDE_HIDDEN (__preinit_array_end = .);
157
158		. = ALIGN(4);
159		/* init data */
160		PROVIDE_HIDDEN (__init_array_start = .);
161		KEEP(*(SORT(.init_array.*)))
162		KEEP(*(.init_array))
163		PROVIDE_HIDDEN (__init_array_end = .);
164
165
166		. = ALIGN(4);
167		/* finit data */
168		PROVIDE_HIDDEN (__fini_array_start = .);
169		KEEP(*(SORT(.fini_array.*)))
170		KEEP(*(.fini_array))
171		PROVIDE_HIDDEN (__fini_array_end = .);
172
173		KEEP(*(.jcr*))
174		. = ALIGN(4);
175		/* All data end */
176		__data_end__ = .;
177
178	} > RAM
179
180	.bss :
181	{
182		. = ALIGN(4);
183		__bss_start__ = .;
184		*(.bss*)
185		*(COMMON)
186		. = ALIGN(4);
187		__bss_end__ = .;
188	} > RAM
189
190	.heap (COPY):
191	{
192		__end__ = .;
193		PROVIDE(end = .);
194		*(.heap*)
195		__HeapLimit = .;
196	} > RAM
197
198	/* .stack_dummy section doesn't contains any symbols. It is only
199	 * used for linker to calculate size of stack sections, and assign
200	 * values to stack symbols later */
201	.stack_dummy (COPY):
202	{
203		*(.stack*)
204	} > RAM
205
206	/* Set stack top to end of RAM, and stack limit move down by
207	 * size of stack_dummy section */
208	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
209	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
210	PROVIDE(__stack = __StackTop);
211
212	__ram_end__ = ORIGIN(RAM) + LENGTH(RAM) -1 ;
213
214	/* Check if data + heap + stack exceeds RAM limit */
215	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
216}
217