xref: /nrf52832-nimble/nordic/nrfx/mdk/nrf_common.ld (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero/* Linker script for Nordic Semiconductor nRF devices
2*150812a8SEvalZero *
3*150812a8SEvalZero * Version: Sourcery G++ 4.5-1
4*150812a8SEvalZero * Support: https://support.codesourcery.com/GNUToolchain/
5*150812a8SEvalZero *
6*150812a8SEvalZero * Copyright (c) 2007, 2008, 2009, 2010 CodeSourcery, Inc.
7*150812a8SEvalZero *
8*150812a8SEvalZero * The authors hereby grant permission to use, copy, modify, distribute,
9*150812a8SEvalZero * and license this software and its documentation for any purpose, provided
10*150812a8SEvalZero * that existing copyright notices are retained in all copies and that this
11*150812a8SEvalZero * notice is included verbatim in any distributions.  No written agreement,
12*150812a8SEvalZero * license, or royalty fee is required for any of the authorized uses.
13*150812a8SEvalZero * Modifications to this software may be copyrighted by their authors
14*150812a8SEvalZero * and need not follow the licensing terms described here, provided that
15*150812a8SEvalZero * the new terms are clearly indicated on the first page of each file where
16*150812a8SEvalZero * they apply.
17*150812a8SEvalZero */
18*150812a8SEvalZeroOUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
19*150812a8SEvalZero
20*150812a8SEvalZero/* Linker script to place sections and symbol values. Should be used together
21*150812a8SEvalZero * with other linker script that defines memory regions FLASH and RAM.
22*150812a8SEvalZero * It references following symbols, which must be defined in code:
23*150812a8SEvalZero *   Reset_Handler : Entry of reset handler
24*150812a8SEvalZero *
25*150812a8SEvalZero * It defines following symbols, which code can use without definition:
26*150812a8SEvalZero *   __exidx_start
27*150812a8SEvalZero *   __exidx_end
28*150812a8SEvalZero *   __etext
29*150812a8SEvalZero *   __data_start__
30*150812a8SEvalZero *   __preinit_array_start
31*150812a8SEvalZero *   __preinit_array_end
32*150812a8SEvalZero *   __init_array_start
33*150812a8SEvalZero *   __init_array_end
34*150812a8SEvalZero *   __fini_array_start
35*150812a8SEvalZero *   __fini_array_end
36*150812a8SEvalZero *   __data_end__
37*150812a8SEvalZero *   __bss_start__
38*150812a8SEvalZero *   __bss_end__
39*150812a8SEvalZero *   __end__
40*150812a8SEvalZero *   end
41*150812a8SEvalZero *   __HeapBase
42*150812a8SEvalZero *   __HeapLimit
43*150812a8SEvalZero *   __StackLimit
44*150812a8SEvalZero *   __StackTop
45*150812a8SEvalZero *   __stack
46*150812a8SEvalZero */
47*150812a8SEvalZeroENTRY(Reset_Handler)
48*150812a8SEvalZero
49*150812a8SEvalZeroSECTIONS
50*150812a8SEvalZero{
51*150812a8SEvalZero    .text :
52*150812a8SEvalZero    {
53*150812a8SEvalZero        KEEP(*(.isr_vector))
54*150812a8SEvalZero        *(.text*)
55*150812a8SEvalZero
56*150812a8SEvalZero        KEEP(*(.init))
57*150812a8SEvalZero        KEEP(*(.fini))
58*150812a8SEvalZero
59*150812a8SEvalZero        /* .ctors */
60*150812a8SEvalZero        *crtbegin.o(.ctors)
61*150812a8SEvalZero        *crtbegin?.o(.ctors)
62*150812a8SEvalZero        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
63*150812a8SEvalZero        *(SORT(.ctors.*))
64*150812a8SEvalZero        *(.ctors)
65*150812a8SEvalZero
66*150812a8SEvalZero        /* .dtors */
67*150812a8SEvalZero        *crtbegin.o(.dtors)
68*150812a8SEvalZero        *crtbegin?.o(.dtors)
69*150812a8SEvalZero        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
70*150812a8SEvalZero        *(SORT(.dtors.*))
71*150812a8SEvalZero        *(.dtors)
72*150812a8SEvalZero
73*150812a8SEvalZero        *(.rodata*)
74*150812a8SEvalZero
75*150812a8SEvalZero        KEEP(*(.eh_frame*))
76*150812a8SEvalZero    } > FLASH
77*150812a8SEvalZero
78*150812a8SEvalZero    .ARM.extab :
79*150812a8SEvalZero    {
80*150812a8SEvalZero        *(.ARM.extab* .gnu.linkonce.armextab.*)
81*150812a8SEvalZero    } > FLASH
82*150812a8SEvalZero
83*150812a8SEvalZero    __exidx_start = .;
84*150812a8SEvalZero    .ARM.exidx :
85*150812a8SEvalZero    {
86*150812a8SEvalZero        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
87*150812a8SEvalZero    } > FLASH
88*150812a8SEvalZero    __exidx_end = .;
89*150812a8SEvalZero
90*150812a8SEvalZero    __etext = .;
91*150812a8SEvalZero
92*150812a8SEvalZero    .data : AT (__etext)
93*150812a8SEvalZero    {
94*150812a8SEvalZero        __data_start__ = .;
95*150812a8SEvalZero        *(vtable)
96*150812a8SEvalZero        *(.data*)
97*150812a8SEvalZero
98*150812a8SEvalZero        . = ALIGN(4);
99*150812a8SEvalZero        /* preinit data */
100*150812a8SEvalZero        PROVIDE_HIDDEN (__preinit_array_start = .);
101*150812a8SEvalZero        KEEP(*(.preinit_array))
102*150812a8SEvalZero        PROVIDE_HIDDEN (__preinit_array_end = .);
103*150812a8SEvalZero
104*150812a8SEvalZero        . = ALIGN(4);
105*150812a8SEvalZero        /* init data */
106*150812a8SEvalZero        PROVIDE_HIDDEN (__init_array_start = .);
107*150812a8SEvalZero        KEEP(*(SORT(.init_array.*)))
108*150812a8SEvalZero        KEEP(*(.init_array))
109*150812a8SEvalZero        PROVIDE_HIDDEN (__init_array_end = .);
110*150812a8SEvalZero
111*150812a8SEvalZero
112*150812a8SEvalZero        . = ALIGN(4);
113*150812a8SEvalZero        /* finit data */
114*150812a8SEvalZero        PROVIDE_HIDDEN (__fini_array_start = .);
115*150812a8SEvalZero        KEEP(*(SORT(.fini_array.*)))
116*150812a8SEvalZero        KEEP(*(.fini_array))
117*150812a8SEvalZero        PROVIDE_HIDDEN (__fini_array_end = .);
118*150812a8SEvalZero
119*150812a8SEvalZero        KEEP(*(.jcr*))
120*150812a8SEvalZero        . = ALIGN(4);
121*150812a8SEvalZero        /* All data end */
122*150812a8SEvalZero        __data_end__ = .;
123*150812a8SEvalZero
124*150812a8SEvalZero    } > RAM
125*150812a8SEvalZero
126*150812a8SEvalZero    .bss :
127*150812a8SEvalZero    {
128*150812a8SEvalZero        . = ALIGN(4);
129*150812a8SEvalZero        __bss_start__ = .;
130*150812a8SEvalZero        *(.bss*)
131*150812a8SEvalZero        *(COMMON)
132*150812a8SEvalZero        . = ALIGN(4);
133*150812a8SEvalZero        __bss_end__ = .;
134*150812a8SEvalZero    } > RAM
135*150812a8SEvalZero
136*150812a8SEvalZero    .heap (COPY):
137*150812a8SEvalZero    {
138*150812a8SEvalZero        __HeapBase = .;
139*150812a8SEvalZero        __end__ = .;
140*150812a8SEvalZero        PROVIDE(end = .);
141*150812a8SEvalZero        KEEP(*(.heap*))
142*150812a8SEvalZero        __HeapLimit = .;
143*150812a8SEvalZero    } > RAM
144*150812a8SEvalZero
145*150812a8SEvalZero    /* .stack_dummy section doesn't contains any symbols. It is only
146*150812a8SEvalZero     * used for linker to calculate size of stack sections, and assign
147*150812a8SEvalZero     * values to stack symbols later */
148*150812a8SEvalZero    .stack_dummy (COPY):
149*150812a8SEvalZero    {
150*150812a8SEvalZero        KEEP(*(.stack*))
151*150812a8SEvalZero    } > RAM
152*150812a8SEvalZero
153*150812a8SEvalZero    /* Set stack top to end of RAM, and stack limit move down by
154*150812a8SEvalZero     * size of stack_dummy section */
155*150812a8SEvalZero    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
156*150812a8SEvalZero    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
157*150812a8SEvalZero    PROVIDE(__stack = __StackTop);
158*150812a8SEvalZero
159*150812a8SEvalZero    /* Check if data + heap + stack exceeds RAM limit */
160*150812a8SEvalZero    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
161*150812a8SEvalZero
162*150812a8SEvalZero    /* Check if text sections + data exceeds FLASH limit */
163*150812a8SEvalZero    DataInitFlashUsed = __bss_start__ - __data_start__;
164*150812a8SEvalZero    CodeFlashUsed = __etext - ORIGIN(FLASH);
165*150812a8SEvalZero    TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
166*150812a8SEvalZero    ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
167*150812a8SEvalZero
168*150812a8SEvalZero}
169