aboutsummaryrefslogtreecommitdiff
path: root/arch/src/armv7-m/ld.S
blob: 7a36de0b920bfe8b72461bec9c0af55a0c5ca929 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
 * Arm SCP/MCP Software
 * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 * Description:
 *      GNU LD linker script.
 */

#include "scatter.h"

ENTRY(arm_exception_reset)

MEMORY {
#if FIRMWARE_MEM_MODE == FWK_MEM_MODE_SINGLE_REGION
    mem0 : ORIGIN = FIRMWARE_MEM0_BASE, LENGTH = FIRMWARE_MEM0_SIZE
#else
    mem0 (rx) : ORIGIN = FIRMWARE_MEM0_BASE, LENGTH = FIRMWARE_MEM0_SIZE
    mem1 (!rx) : ORIGIN = FIRMWARE_MEM1_BASE, LENGTH = FIRMWARE_MEM1_SIZE
#endif
}

#if FIRMWARE_MEM_MODE == FWK_MEM_MODE_SINGLE_REGION
    REGION_ALIAS("mem1", mem0);
#endif

REGION_ALIAS("vexception", mem0);
REGION_ALIAS("vtext", mem0);
REGION_ALIAS("vrodata", mem0);
REGION_ALIAS("vdata", mem1);
REGION_ALIAS("vbss", mem1);
REGION_ALIAS("vstackheap", mem1);

#if FIRMWARE_MEM_MODE == FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION
    REGION_ALIAS("ldata", mem1); /* .data is loaded into mem1 by a loader */
#else
    REGION_ALIAS("ldata", mem0); /* .data is loaded into mem1 by crt0 */
#endif

SECTIONS {
    /*
     * Variables defined here:
     *   - __data_load__: Load address of .data
     *   - __data_start__: Start address of .data
     *   - __data_end__: End address of .data and .data-like orphans
     *   - __bss_start__: Start address of .bss
     *   - __bss_end__: End address of .bss and .bss-like orphans
     *   - __stackheap_start__: Start address of .stackheap
     *   - __stackheap_end__: End address of .stackheap
     *   - __stack: Initial stack pointer
     */

    .exceptions : {
        KEEP(*(.exceptions))
    } > vexception

    .text : {
        *(.text .text.*)
    } > vtext

    .rodata : {
        *(.rodata .rodata.*)
    } > vrodata

    .data : {
        *(.data .data.*)
    } > vdata AT>ldata

    .bss : {
        *(.bss .bss.*)
    } > vbss

    .stackheap ALIGN(HEAP_ALIGNMENT) : {
        . = ORIGIN(vstackheap) + LENGTH(vstackheap) - (STACK_ALIGNMENT - 1);
        . = ALIGN(STACK_ALIGNMENT);
    } > vstackheap

    __data_load__ = LOADADDR(.data);
    __data_start__ = ADDR(.data);
    __data_end__ = ADDR(.data) + SIZEOF(.data);

    __bss_start__ = ADDR(.bss);
    __bss_end__ = ADDR(.bss) + SIZEOF(.bss);

    __stackheap_start__ = ADDR(.stackheap);
    __stackheap_end__ = ADDR(.stackheap) + SIZEOF(.stackheap);

    __stack = __stackheap_end__;
}