Skip to content

Commit 3cbe118

Browse files
committed
Use picolibc instead of newlib-nano
Add picolibc bits to linker scripts. Support picolibc stdio. Add _exit stub. Switch to picolibc.specs Signed-off-by: Keith Packard <[email protected]>
1 parent 021e2bb commit 3cbe118

File tree

11 files changed

+260
-34
lines changed

11 files changed

+260
-34
lines changed

platform/ext/common/gcc/tfm_common_bl2.ld

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,24 @@ SECTIONS
153153
} > RAM AT > FLASH
154154
Image$$ER_DATA$$Base = ADDR(.data);
155155

156+
.tdata : /* For ld.lld: ALIGN(__tls_align) */ ALIGN_WITH_INPUT {
157+
*(.tdata .tdata.* .gnu.linkonce.td.*)
158+
PROVIDE(__data_end = .);
159+
PROVIDE(__tdata_end = .);
160+
} >RAM AT>FLASH
161+
162+
.tbss (NOLOAD) : {
163+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
164+
*(.tcommon)
165+
PROVIDE( __tls_end = . );
166+
PROVIDE( __tbss_end = . );
167+
} >RAM AT>RAM
168+
169+
.tbss_space (NOLOAD) : {
170+
. = ADDR(.tbss);
171+
. = . + SIZEOF(.tbss);
172+
} >RAM AT>RAM
173+
156174
.bss : ALIGN(4)
157175
{
158176
. = ALIGN(4);
@@ -161,8 +179,18 @@ SECTIONS
161179
*(COMMON)
162180
. = ALIGN(4);
163181
__bss_end__ = .;
182+
__bss_end = .;
164183
} > RAM
165184

185+
PROVIDE(__data_start = ADDR(.data));
186+
PROVIDE(__data_source = LOADADDR(.data));
187+
PROVIDE(__data_size = __data_end - __data_start);
188+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
189+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
190+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
191+
PROVIDE( __bss_start = ADDR(.tbss));
192+
PROVIDE( __bss_size = __bss_end - __bss_start );
193+
166194
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
167195
.msp_stack (NOLOAD) : ALIGN(32)
168196
{
@@ -193,11 +221,15 @@ SECTIONS
193221
__end__ = .;
194222
PROVIDE(end = .);
195223
__HeapBase = .;
224+
__heap_start = .;
196225
. += __heap_size__;
197226
__HeapLimit = .;
198227
__heap_limit = .; /* Add for _sbrk */
228+
__heap_end = .;
199229
} > RAM
200230
Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap);
201231

202232
PROVIDE(__stack = Image$$ARM_LIB_STACK$$ZI$$Limit);
233+
PROVIDE(__heap_start = ADDR(.heap));
234+
PROVIDE(__heap_end = ADDR(.heap) + SIZEOF(.heap));
203235
}

platform/ext/common/gcc/tfm_common_ns.ld

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,50 @@ SECTIONS
128128

129129
KEEP(*(.jcr*))
130130
. = ALIGN(4);
131-
/* All data end */
132-
__data_end__ = .;
133131

134132
} > RAM
135133

136-
.bss :
134+
.tdata : AT (__etext + SIZEOF(.data))
137135
{
136+
*(.tdata .tdata.* .gnu.linkonce.td.*)
137+
PROVIDE(__data_end = .);
138+
PROVIDE(__data_end__ = .);
139+
PROVIDE(__tdata_end = .);
140+
} > RAM
141+
142+
.tbss (NOLOAD) : {
138143
. = ALIGN(4);
139144
__bss_start__ = .;
145+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
146+
*(.tcommon)
147+
PROVIDE( __tls_end = . );
148+
PROVIDE( __tbss_end = . );
149+
} > RAM
150+
151+
.tbss_space (NOLOAD) : {
152+
. = ADDR(.tbss);
153+
. = . + SIZEOF(.tbss);
154+
} > RAM
155+
156+
.bss :
157+
{
158+
. = ALIGN(4);
140159
*(.bss*)
141160
*(COMMON)
142161
. = ALIGN(4);
143162
__bss_end__ = .;
163+
PROVIDE(__bss_end = .);
144164
} > RAM
145165

146166
bss_size = __bss_end__ - __bss_start__;
167+
PROVIDE(__data_start = ADDR(.data));
168+
PROVIDE(__data_source = LOADADDR(.data));
169+
PROVIDE(__data_size = __data_end - __data_start );
170+
PROVIDE( __bss_start = ADDR(.tbss));
171+
PROVIDE( __bss_size = __bss_end - __bss_start );
172+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
173+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
174+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
147175

148176
.stack : ALIGN(32)
149177
{
@@ -158,9 +186,11 @@ SECTIONS
158186
__end__ = .;
159187
PROVIDE(end = .);
160188
__HeapBase = .;
189+
PROVIDE(__heap_start = .);
161190
. += __heap_size__;
162191
__HeapLimit = .;
163192
__heap_limit = .; /* Add for _sbrk */
193+
PROVIDE(__heap_end = .);
164194
} > RAM
165195

166196
PROVIDE(__stack = __StackTop);

platform/ext/common/gcc/tfm_common_s.ld.template

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -573,13 +573,34 @@ SECTIONS
573573
. = ALIGN(4);
574574

575575
} > RAM AT> FLASH
576+
577+
.TFM_TDATA : ALIGN_WITH_INPUT {
578+
*(.tdata .tdata.* .gnu.linkonce.td.*)
579+
PROVIDE(__data_end = .);
580+
PROVIDE(__tdata_end = .);
581+
} > RAM AT> FLASH
582+
576583
Image$$ER_TFM_DATA$$RW$$Base = ADDR(.TFM_DATA);
577-
Image$$ER_TFM_DATA$$RW$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA);
584+
Image$$ER_TFM_DATA$$RW$$Limit = ADDR(.TFM_TDATA) + SIZEOF(.TFM_TDATA);
578585

579-
.TFM_BSS ALIGN(4) (NOLOAD) :
580-
{
586+
.TFM_TBSS (NOLOAD) : {
581587
__bss_start__ = .;
582588

589+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
590+
*(.tcommon)
591+
PROVIDE( __tls_end = . );
592+
PROVIDE( __tbss_end = . );
593+
} > RAM AT> RAM
594+
PROVIDE( __tls_align = MAX(ALIGNOF(.TFM_TDATA), ALIGNOF(.TFM_TBSS)) );
595+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
596+
597+
.TFM_TBSS_SPACE (NOLOAD) : {
598+
. = ADDR(.TFM_TBSS);
599+
. = . + SIZEOF(.TFM_TBSS);
600+
} > RAM AT> RAM
601+
602+
.TFM_BSS ALIGN(4) (NOLOAD) :
603+
{
583604
/* The runtime partition placed order is same as load partition */
584605
__partition_runtime_start__ = .;
585606
KEEP(*(.bss.part_runtime_priority_00))
@@ -600,16 +621,26 @@ SECTIONS
600621
*(COMMON)
601622
. = ALIGN(4);
602623
__bss_end__ = .;
624+
__bss_end = .;
603625
} > RAM AT> RAM
604-
Image$$ER_TFM_DATA$$ZI$$Base = ADDR(.TFM_BSS);
626+
Image$$ER_TFM_DATA$$ZI$$Base = ADDR(.TFM_TBSS);
605627
Image$$ER_TFM_DATA$$ZI$$Limit = ADDR(.TFM_BSS) + SIZEOF(.TFM_BSS);
606628
Image$$ER_PART_RT_POOL$$ZI$$Base = __partition_runtime_start__;
607629
Image$$ER_PART_RT_POOL$$ZI$$Limit = __partition_runtime_end__;
608630
Image$$ER_SERV_RT_POOL$$ZI$$Base = __service_runtime_start__;
609631
Image$$ER_SERV_RT_POOL$$ZI$$Limit = __service_runtime_end__;
610632

611633
Image$$ER_TFM_DATA$$Base = ADDR(.TFM_DATA);
612-
Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA) + SIZEOF(.TFM_BSS);
634+
Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_BSS) + SIZEOF(.TFM_BSS);
635+
636+
PROVIDE(__data_start = ADDR(.TFM_DATA));
637+
PROVIDE(__data_source = LOADADDR(.TFM_DATA));
638+
PROVIDE(__data_size = __data_end - __data_start );
639+
PROVIDE( __bss_start = ADDR(.TFM_TBSS));
640+
PROVIDE( __bss_size = __bss_end - __bss_start );
641+
PROVIDE( __tls_base = SIZEOF(.TFM_TDATA) ? ADDR(.TFM_TDATA) : ADDR(.TFM_TBSS) );
642+
PROVIDE( __tls_align = MAX(ALIGNOF(.TFM_TDATA), ALIGNOF(.TFM_TBSS)) );
643+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
613644

614645
#if defined(CONFIG_TFM_USE_TRUSTZONE)
615646
Image$$ER_VENEER$$Base = ADDR(.gnu.sgstubs);

platform/ext/common/syscalls_stub.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,12 @@ __attribute__((weak))
5353
void _write(void)
5454
{
5555
}
56+
57+
#ifdef __PICOLIBC__
58+
void
59+
_exit(int status)
60+
{
61+
(void) status;
62+
for(;;);
63+
}
64+
#endif

platform/ext/common/uart_stdout.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ int fputc(int ch, FILE *f)
8585
/* Redirect sdtio for PicoLib in LLVM toolchain
8686
as per https://github.com/picolibc/picolibc/blob/main/doc/os.md
8787
'fputch()' named intentionally different from 'fputc()' from picolib */
88-
#elif defined(__clang_major__)
88+
#elif defined(__PICOLIBC__)
8989

9090
int fputch(char ch, struct __file *f)
9191
{

platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,48 @@ SECTIONS
156156
} > RAM AT > FLASH
157157
Image$$ER_DATA$$Base = ADDR(.data);
158158

159-
.bss : ALIGN(4)
159+
.tdata :
160160
{
161+
*(.tdata .tdata.* .gnu.linkonce.td.*)
162+
PROVIDE(__data_end = .);
163+
PROVIDE(__data_end__ = .);
164+
PROVIDE(__tdata_end = .);
165+
} > RAM AT > FLASH
166+
167+
.tbss (NOLOAD) : {
161168
. = ALIGN(4);
162169
__bss_start__ = .;
170+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
171+
*(.tcommon)
172+
PROVIDE( __tls_end = . );
173+
PROVIDE( __tbss_end = . );
174+
} > RAM
175+
176+
.tbss_space (NOLOAD) : {
177+
. = ADDR(.tbss);
178+
. = . + SIZEOF(.tbss);
179+
} > RAM
180+
181+
.bss : ALIGN(4)
182+
{
183+
. = ALIGN(4);
163184
*(.bss*)
164185
*(COMMON)
165186
. = ALIGN(4);
166187
__bss_end__ = .;
188+
PROVIDE(__bss_end = .);
167189
} > RAM
168190

191+
bss_size = __bss_end__ - __bss_start__;
192+
PROVIDE(__data_start = ADDR(.data));
193+
PROVIDE(__data_source = LOADADDR(.data));
194+
PROVIDE(__data_size = __data_end - __data_start );
195+
PROVIDE( __bss_start = ADDR(.tbss));
196+
PROVIDE( __bss_size = __bss_end - __bss_start );
197+
PROVIDE( __tls_base = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
198+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
199+
PROVIDE(__arm32_tls_tcb_offset = MAX(8, __tls_align) );
200+
169201
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
170202
.msp_stack (NOLOAD) : ALIGN(32)
171203
{
@@ -196,9 +228,11 @@ SECTIONS
196228
__end__ = .;
197229
PROVIDE(end = .);
198230
__HeapBase = .;
231+
PROVIDE(__heap_start = .);
199232
. += __heap_size__;
200233
__HeapLimit = .;
201234
__heap_limit = .; /* Add for _sbrk */
235+
PROVIDE(__heap_end = .);
202236
} > RAM
203237
Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap);
204238

platform/ext/target/stm/common/hal/template/gcc/bl2.ld

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,24 +169,56 @@ SECTIONS
169169

170170
KEEP(*(.jcr*))
171171
. = ALIGN(4);
172+
173+
} > RAM
174+
175+
.tdata : ALIGN_WITH_INPUT {
176+
*(.tdata .tdata.* .gnu.linkonce.td.*)
177+
PROVIDE(__data_end = .);
178+
PROVIDE(__tdata_end = .);
172179
/* All data end */
173180
__data_end__ = .;
181+
} > RAM
174182

175-
} > RAM
176183
Image$$ER_CODE$$Base = __Vectors ;
177-
Image$$ER_CODE$$Limit = __etext + + SIZEOF(.data);
184+
Image$$ER_CODE$$Limit = __etext + + SIZEOF(.data) + SIZEOF(.tdata);
185+
186+
.tbss (NOLOAD) : {
187+
. = ALIGN(4);
188+
__bss_start__ = .;
189+
*(.tbss .tbss.* .gnu.linkonce.tb.*)
190+
*(.tcommon)
191+
PROVIDE( __tls_end = . );
192+
PROVIDE( __tbss_end = . );
193+
} > RAM
194+
195+
.tbss_space (NOLOAD) : {
196+
. = ADDR(.tbss);
197+
. = . + SIZEOF(.tbss);
198+
} > RAM
199+
178200
.bss :
179201
{
180202
. = ALIGN(4);
181-
__bss_start__ = .;
182203
*(.bss*)
183204
*(COMMON)
184205
. = ALIGN(4);
185206
__bss_end__ = .;
207+
PROVIDE(__bss_end = .);
186208
} > RAM
187209

188210
bss_size = __bss_end__ - __bss_start__;
189211

212+
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
213+
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
214+
PROVIDE(__data_source = LOADADDR(.data));
215+
PROVIDE(__data_start = ADDR(.data));
216+
PROVIDE( __data_size = __data_end - __data_start );
217+
PROVIDE( __bss_start = ADDR(.tbss));
218+
PROVIDE( __bss_size = __bss_end - __bss_start );
219+
PROVIDE( __tls_first = SIZEOF(.tdata) ? ADDR(.tdata) : ADDR(.tbss) );
220+
PROVIDE( __tls_base = __tls_first );
221+
190222
.msp_stack :
191223
{
192224
. = ALIGN(8);
@@ -208,4 +240,8 @@ SECTIONS
208240
} > RAM
209241

210242
PROVIDE(__stack = Image$$ARM_LIB_STACK$$ZI$$Limit);
243+
244+
PROVIDE(__heap_start = ADDR(.heap));
245+
PROVIDE(__heap_end = ADDR(.heap) + SIZEOF(.heap));
246+
211247
}

0 commit comments

Comments
 (0)