1515
1616******************************************************************************************/
1717
18+ INPUT (libc.a libm.a libgcc.a)
19+
1820/* *****************************************************************************************
1921 ELF Entrypoint
2022******************************************************************************************/
@@ -23,137 +25,164 @@ ENTRY(_start)
2325/* *****************************************************************************************
2426 Globals
2527******************************************************************************************/
26- __FLASH_START_ADDRESS = 0x23000000;
27- __FLASH_SIZE = 2M;
2828
29- __ITCM_START_ADDRESS = 0x22008000 ;
30- __ITCM_SIZE = 48K;
29+ __STACK_SIZE = 4K;
3130
32- __DTCM_START_ADDRESS = 0x42014000 ;
33- __DTCM_SIZE = 48K ;
31+ __RAM_START_ADDRESS = 0x42020000 ;
32+ __RAM_SIZE = 64K - __STACK_SIZE ;
3433
35- __STACK_START_ADDRESS = 0x42020000 ;
36- __STACK_SIZE = 1K;
34+ __STACK_START_ADDRESS = __RAM_START_ADDRESS + __RAM_SIZE;
3735
38- __RAM_START_ADDRESS = 0x42020000 + __STACK_SIZE;
39- __RAM_SIZE = 64K - __STACK_SIZE;
36+ __ROM_START_ADDRESS = 0x23000000 ;
4037
4138/* *****************************************************************************************
4239 Memory configuration
4340******************************************************************************************/
4441
4542MEMORY
4643{
47- FLASH (rx) : ORIGIN = __FLASH_START_ADDRESS, LENGTH = __FLASH_SIZE
48- ITCM (rx) : ORIGIN = __ITCM_START_ADDRESS, LENGTH = __ITCM_SIZE
49- DTCM (rx) : ORIGIN = __DTCM_START_ADDRESS, LENGTH = __DTCM_SIZE
50- STACK (rw) : ORIGIN = __STACK_START_ADDRESS, LENGTH = __STACK_SIZE
51- RAM (rwx) : ORIGIN = __RAM_START_ADDRESS, LENGTH = __RAM_SIZE
44+ BOOT (rx) : ORIGIN = 0x23000000 , LENGTH = 0x100
45+ START (rx) : ORIGIN = 0x23000100 , LENGTH = 0x300
46+ ROM (rx) : ORIGIN = 0x23000400 , LENGTH = 256K - 0x400
47+ SRAM (rwx) : ORIGIN = __RAM_START_ADDRESS, LENGTH = 32K
48+ RAM (rwx) : ORIGIN = __RAM_START_ADDRESS + 32K, LENGTH = __RAM_SIZE - 32K
49+ STACK (rw) : ORIGIN = __STACK_START_ADDRESS, LENGTH = __STACK_SIZE
5250}
5351
5452/* *****************************************************************************************
5553 Sections definition
5654******************************************************************************************/
5755SECTIONS
5856{
59- /* Program code (text) */
60- .text : ALIGN (4 )
57+ . = __ROM_START_ADDRESS;
58+
59+ .boot : ALIGN (0x10 )
6160 {
62- PROVIDE (__CODE_BASE_ADDRESS = .);
6361 *(.boot )
64- *(.text )
65- . = ALIGN (4 );
66- } > FLASH
62+ . = ALIGN (0x10 );
63+ *(.boot *)
64+ . = ALIGN (0x10 );
65+ } > BOOT = 0x5555
6766
68- /* Read-only data (.rodata) */
69- .rodata : ALIGN (4 )
67+ .startup : ALIGN (0x10 )
7068 {
71- PROVIDE (__RODATA_BASE_ADDRESS = .);
72- *(.rodata )
73- } > FLASH
69+ *(.startup )
70+ . = ALIGN (0x10 );
71+ *(.startup *)
72+ . = ALIGN (0x10 );
73+ } > START = 0x5555
7474
75- /* Section for constructors */
76- .ctors : ALIGN (4 )
75+ /* Program code (text) */
76+ .text : ALIGN (0x100 )
7777 {
78- PROVIDE (__CTOR_LIST__ = .);
79- KEEP (*(SORT (.ctors .*)))
80- KEEP (*(.ctors ))
81- KEEP (*(SORT (.init_array .*)))
82- KEEP (*(.init_array ))
83- LONG (-1 ) ;
84- PROVIDE (__CTOR_END__ = .);
78+ _ctors_begin = .;
79+ KEEP (*(SORT (.init_array .*)))
80+ KEEP (*(.init_array *))
81+ _ctors_end = .;
82+ *(.progmem *)
8583 . = ALIGN (4 );
86- } > FLASH
87-
84+ *(.text )
85+ . = ALIGN (4 );
86+ *(.text *)
87+ . = ALIGN (4 );
88+ *(.rodata )
89+ . = ALIGN (4 );
90+ *(.rodata *)
91+ . = ALIGN (4 );
92+ *(.srodata )
93+ . = ALIGN (4 );
94+ *(.srodata *)
95+ . = ALIGN (4 );
96+ *(.glue_7 )
97+ . = ALIGN (4 );
98+ *(.glue_7t )
99+ . = ALIGN (4 );
100+ } > ROM
88101
89- /* Section for destructors */
90- .dtors : ALIGN (4 )
102+ .riscv.extab :
91103 {
92- PROVIDE (__DTOR_LIST__ = .);
93- KEEP (*(SORT (.dtors .*)))
94- KEEP (*(.dtors ))
95- KEEP (*(SORT (.fini_array .*)))
96- KEEP (*(.fini_array ))
97- LONG (-1 ) ;
98- PROVIDE (__DTOR_END__ = .);
99- . = ALIGN (4 );
100- } > FLASH
101-
102- /* Runtime clear table */
103- .clear_sec : ALIGN (4 )
104+ . = ALIGN (4 );
105+ *(.riscv .extab )
106+ *(.gnu .linkonce .riscvextab .*)
107+ . = ALIGN (4 );
108+ } > ROM
109+
110+ .exidx :
104111 {
105- PROVIDE (__RUNTIME_CLEAR_TABLE = .) ;
106- LONG (0 + ADDR (.bss )); LONG (SIZEOF (.bss ));
107- LONG (-1 ); LONG (-1 );
108112 . = ALIGN (4 );
109- } > FLASH
113+ PROVIDE (__exidx_start = .);
114+ *(.riscv .exidx *)
115+ . = ALIGN (4 );
116+ PROVIDE (__exidx_end = .);
117+ } > ROM
118+
119+ . = __RAM_START_ADDRESS;
120+ . = ALIGN (4 );
110121
111- /* Runtime copy table */
112- .copy_sec : ALIGN (4 )
122+ /* The ROM-to-RAM initialized sdata section */
123+ .sdata : ALIGN (4 )
113124 {
114- PROVIDE (__RUNTIME_COPY_TABLE = .) ;
115- LONG (LOADADDR (.data )); LONG (0 + ADDR (.data )); LONG (SIZEOF (.data ));
116- LONG (LOADADDR (.sdata )); LONG (0 + ADDR (.sdata )); LONG (SIZEOF (.sdata ));
117- LONG (-1 ); LONG (-1 ); LONG (-1 );
125+ _sdata_begin = .;
126+ *(.sdata )
118127 . = ALIGN (4 );
119- PROVIDE (__CODE_END_ADDRESS = .);
120- } > FLASH
128+ KEEP (*(.sdata ))
129+ *(.sdata *)
130+ . = ALIGN (4 );
131+ KEEP (*(.sdata *))
132+ _sdata_end = .;
133+ } > SRAM AT > ROM
121134
122- /* The ROM-to-RAM initialized data sections */
123- .data : ALIGN (4 )
135+ /* The ROM-to-RAM initialized data section */
136+ .data : ALIGN (4 )
124137 {
138+ _data_begin = .;
125139 *(.data )
140+ . = ALIGN (4 );
141+ KEEP (*(.data ))
126142 *(.data *)
127143 . = ALIGN (4 );
128- } > RAM AT>FLASH
129-
130- .sdata : ALIGN (4 )
144+ KEEP (*(.data *))
145+ _data_end = .;
146+ } > RAM AT > ROM
147+
148+ /* The uninitialized (zero-cleared) sbss section */
149+ .sbss : ALIGN (4 )
131150 {
132- *(.sdata )
151+ _sbss_begin = .;
152+ *(.sbss )
133153 . = ALIGN (4 );
134- } > RAM AT>FLASH
135-
136-
154+ KEEP (*(.sbss ))
155+ *(.sbss *)
156+ . = ALIGN (4 );
157+ KEEP (*(.sbss *))
158+ _sbss_end = .;
159+ } > SRAM
137160
138- /* The uninitialized (zero-cleared) data sections */
161+ /* The uninitialized (zero-cleared) bss section */
139162 .bss : ALIGN (4 )
140163 {
164+ _bss_begin = .;
141165 *(.bss )
142- *(.bss *)
143166 . = ALIGN (4 );
144- } > RAM
145-
146- .sbss : ALIGN (4 )
147- {
148- *(.sbss )
167+ KEEP (*(.bss ))
168+ *(.bss *)
149169 . = ALIGN (4 );
170+ KEEP (*(.bss *))
171+ _bss_end = .;
150172 } > RAM
151173
174+ PROVIDE (end = .);
175+ PROVIDE (_fini = .);
176+
177+ . = __STACK_START_ADDRESS;
178+
152179 /* stack definition */
153180 .stack :
154181 {
155182 . = ALIGN (MAX (__STACK_SIZE , .), 8 );
156- PROVIDE (__STACK_TOP = .) ;
183+ PROVIDE (__initial_stack_pointer = .) ;
157184 } > STACK
158185
186+ _srom_data_begin = LOADADDR (.sdata );
187+ _rom_data_begin = LOADADDR (.data );
159188}
0 commit comments