forked from tock/libtock-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlayout.ld
More file actions
151 lines (134 loc) · 3.8 KB
/
Copy pathlayout.ld
File metadata and controls
151 lines (134 loc) · 3.8 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* Userland Generic Layout
*
* This linker script is designed for Tock apps where the end microcontroller
* is not known. Therefore, this script over provisions space on some platforms.
*/
STACK_SIZE = 2048;
APP_HEAP_SIZE = 1024;
KERNEL_HEAP_SIZE = 1024;
ENTRY(_start)
/* Note: Because apps are relocated, the FLASH address here acts as a sentinel
* value for relocation fixup routines. The application loader will select the
* actual location in flash where the app is placed.
*/
MEMORY {
FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 0x0040000
SRAM (RWX) : ORIGIN = 0x00000000, LENGTH = 0x0010000
}
SECTIONS {
/* Text section, Code! */
.text :
{
_text = .;
/**
* Populate the header expected by `crt0`:
*
*
* struct hdr {
* uint32_t got_sym_start;
* uint32_t got_start;
* uint32_t got_size;
* uint32_t data_sym_start;
* uint32_t data_start;
* uint32_t data_size;
* uint32_t bss_start;
* uint32_t bss_size;
* uint32_t reldata_start;
* };
*/
/* Offset of GOT symbols in flash */
LONG(LOADADDR(.got) - _text);
/* Offset of GOT section in memory */
LONG(_got);
/* Size of GOT section */
LONG(SIZEOF(.got));
/* Offset of data symbols in flash */
LONG(LOADADDR(.data) - _text);
/* Offset of data section in memory */
LONG(_data);
/* Size of data section */
LONG(SIZEOF(.data));
/* Offset of BSS section in memory */
LONG(_bss);
/* Size of BSS section */
LONG(SIZEOF(.bss));
/* First address offset after program flash, where elf2tbf places
* .rel.data section */
LONG(LOADADDR(.endsec) - _text);
KEEP (*(.start))
*(.text*)
*(.rodata*)
KEEP (*(.syscalls))
_etext = .;
*(.ARM.extab*)
. = ALIGN(4); /* Make sure we're word-aligned here */
} > FLASH =0xFF
/* App state section. Used for persistent app data. */
.app_state :
{
KEEP (*(.app_state))
} > FLASH =0xFF
/* Global Offset Table */
.got :
{
_got = .;
*(.got*)
*(.got.plt*)
} > SRAM AT > FLASH
/* Data section, static initialized variables
* Note: This is placed in Flash after the text section, but needs to be
* moved to SRAM at runtime
*/
.data :
{
_data = .;
KEEP(*(.data*))
} > SRAM AT > FLASH
/* BSS section, static uninitialized variables */
.bss :
{
_bss = .;
KEEP(*(.bss*))
*(COMMON)
} > SRAM
/*
* __NOTE__: The following symbols are used only to hint to elf2tbf how much
* total memory to request from the OS.
*/
.stack :
{
. += STACK_SIZE;
} > SRAM
.app_heap :
{
. += APP_HEAP_SIZE;
} > SRAM
.kernel_heap :
{
. += KERNEL_HEAP_SIZE;
} > SRAM
_sram_end = .;
.endsec :
{
} > FLASH
/* ARM Exception support
*
* This contains compiler-generated support for unwinding the stack,
* consisting of key-value pairs of function addresses and information on
* how to unwind stack frames.
* https://wiki.linaro.org/KenWerner/Sandbox/libunwind?action=AttachFile&do=get&target=libunwind-LDS.pdf
*
* .ARM.exidx is sorted, so has to go in its own output section.
*
* __NOTE__: It's at the end because we currently don't actually serialize
* it to the binary in elf2tbf. If it was before the RAM sections, it would
* through off our calculations of the header.
*/
PROVIDE_HIDDEN (__exidx_start = .);
.ARM.exidx :
{
/* (C++) Index entries for section unwinding */
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
PROVIDE_HIDDEN (__exidx_end = .);
}