1/* Linker script to configure memory regions. */
2
3SEARCH_DIR(.)
4GROUP(-lgcc -lc -lnosys)
5
6MEMORY
7{
8  FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x100000
9  RAM (rwx) :  ORIGIN = 0x20000000, LENGTH = 0x80000
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     .nrf_queue :
68    {
69        PROVIDE(__start_nrf_queue = .);
70        KEEP(*(.nrf_balloc))
71        PROVIDE(__stop_nrf_queue = .);
72    } > FLASH
73
74    .ARM.extab :
75    {
76        *(.ARM.extab* .gnu.linkonce.armextab.*)
77    } > FLASH
78
79    __exidx_start = .;
80    .ARM.exidx :
81    {
82        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
83    } > FLASH
84    __exidx_end = .;
85
86    __etext = .;
87
88    .data : AT (__etext)
89    {
90        __data_start__ = .;
91        *(vtable)
92        *(.data*)
93
94        . = ALIGN(4);
95        /* preinit data */
96        PROVIDE_HIDDEN (__preinit_array_start = .);
97        KEEP(*(.preinit_array))
98        PROVIDE_HIDDEN (__preinit_array_end = .);
99
100        . = ALIGN(4);
101        /* init data */
102        PROVIDE_HIDDEN (__init_array_start = .);
103        KEEP(*(SORT(.init_array.*)))
104        KEEP(*(.init_array))
105        PROVIDE_HIDDEN (__init_array_end = .);
106
107
108        . = ALIGN(4);
109        /* finit data */
110        PROVIDE_HIDDEN (__fini_array_start = .);
111        KEEP(*(SORT(.fini_array.*)))
112        KEEP(*(.fini_array))
113        PROVIDE_HIDDEN (__fini_array_end = .);
114
115        KEEP(*(.jcr*))
116        . = ALIGN(4);
117        /* All data end */
118        __data_end__ = .;
119
120    } > RAM
121
122    .bss :
123    {
124        . = ALIGN(4);
125        __bss_start__ = .;
126        *(.bss*)
127        *(COMMON)
128        . = ALIGN(4);
129        __bss_end__ = .;
130    } > RAM
131
132    .heap (COPY):
133    {
134        __HeapBase = .;
135        __end__ = .;
136        PROVIDE(end = .);
137        KEEP(*(.heap*))
138        __HeapLimit = .;
139    } > RAM
140
141    /* .stack_dummy section doesn't contains any symbols. It is only
142     * used for linker to calculate size of stack sections, and assign
143     * values to stack symbols later */
144    .stack_dummy (COPY):
145    {
146        KEEP(*(.stack*))
147    } > RAM
148
149    /* Set stack top to end of RAM, and stack limit move down by
150     * size of stack_dummy section */
151    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
152    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
153    PROVIDE(__stack = __StackTop);
154
155    /* Check if data + heap + stack exceeds RAM limit */
156    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
157
158    /* Check if text sections + data exceeds FLASH limit */
159    DataInitFlashUsed = __bss_start__ - __data_start__;
160    CodeFlashUsed = __etext - ORIGIN(FLASH);
161    TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
162    ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
163
164}
165
166
167