1/* Linker script to configure memory regions. */
2
3SEARCH_DIR(.)
4GROUP(-lgcc -lc -lnosys)
5
6MEMORY
7{
8  FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x80000
9  RAM (rwx) :  ORIGIN = 0x20000000, LENGTH = 0x20000
10}
11
12ENTRY(Reset_Handler)
13
14SECTIONS
15{
16    .text :
17    {
18        KEEP(*(.isr_vector))
19        *(.text*)
20
21        KEEP(*(.init))
22        KEEP(*(.fini))
23
24        /* .ctors */
25        *crtbegin.o(.ctors)
26        *crtbegin?.o(.ctors)
27        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
28        *(SORT(.ctors.*))
29        *(.ctors)
30
31        /* .dtors */
32        *crtbegin.o(.dtors)
33        *crtbegin?.o(.dtors)
34        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
35        *(SORT(.dtors.*))
36        *(.dtors)
37
38        *(.rodata*)
39
40        KEEP(*(.eh_frame*))
41            /* section information for finsh shell */
42        . = ALIGN(4);
43        __fsymtab_start = .;
44        KEEP(*(FSymTab))
45        __fsymtab_end = .;
46
47        . = ALIGN(4);
48        __vsymtab_start = .;
49        KEEP(*(VSymTab))
50        __vsymtab_end = .;
51
52        /* section information for initial. */
53        . = ALIGN(4);
54        __rt_init_start = .;
55        KEEP(*(SORT(.rti_fn*)))
56        __rt_init_end = .;
57
58        . = ALIGN(4);
59
60        PROVIDE(__ctors_start__ = .);
61        KEEP (*(SORT(.init_array.*)))
62        KEEP (*(.init_array))
63        PROVIDE(__ctors_end__ = .);
64
65    } > FLASH
66
67    .ARM.extab :
68    {
69        *(.ARM.extab* .gnu.linkonce.armextab.*)
70    } > FLASH
71
72    __exidx_start = .;
73    .ARM.exidx :
74    {
75        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
76    } > FLASH
77    __exidx_end = .;
78
79    __etext = .;
80
81    .data : AT (__etext)
82    {
83        __data_start__ = .;
84        *(vtable)
85        *(.data*)
86
87        . = ALIGN(4);
88        /* preinit data */
89        PROVIDE_HIDDEN (__preinit_array_start = .);
90        KEEP(*(.preinit_array))
91        PROVIDE_HIDDEN (__preinit_array_end = .);
92
93        . = ALIGN(4);
94        /* init data */
95        PROVIDE_HIDDEN (__init_array_start = .);
96        KEEP(*(SORT(.init_array.*)))
97        KEEP(*(.init_array))
98        PROVIDE_HIDDEN (__init_array_end = .);
99
100
101        . = ALIGN(4);
102        /* finit data */
103        PROVIDE_HIDDEN (__fini_array_start = .);
104        KEEP(*(SORT(.fini_array.*)))
105        KEEP(*(.fini_array))
106        PROVIDE_HIDDEN (__fini_array_end = .);
107
108        KEEP(*(.jcr*))
109        . = ALIGN(4);
110        /* All data end */
111        __data_end__ = .;
112
113    } > RAM
114
115    .bss :
116    {
117        . = ALIGN(4);
118        __bss_start__ = .;
119        *(.bss*)
120        *(COMMON)
121        . = ALIGN(4);
122        __bss_end__ = .;
123    } > RAM
124
125    .heap (COPY):
126    {
127        __HeapBase = .;
128        __end__ = .;
129        PROVIDE(end = .);
130        KEEP(*(.heap*))
131        __HeapLimit = .;
132    } > RAM
133
134    /* .stack_dummy section doesn't contains any symbols. It is only
135     * used for linker to calculate size of stack sections, and assign
136     * values to stack symbols later */
137    .stack_dummy (COPY):
138    {
139        KEEP(*(.stack*))
140    } > RAM
141
142    /* Set stack top to end of RAM, and stack limit move down by
143     * size of stack_dummy section */
144    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
145    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
146    PROVIDE(__stack = __StackTop);
147
148    /* Check if data + heap + stack exceeds RAM limit */
149    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
150
151    /* Check if text sections + data exceeds FLASH limit */
152    DataInitFlashUsed = __bss_start__ - __data_start__;
153    CodeFlashUsed = __etext - ORIGIN(FLASH);
154    TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
155    ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
156
157}
158
159
160