From 450565aa0de2716bb1d6b5af6e3675c32d5ffa81 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 22 Jul 2025 17:10:35 -0700 Subject: [PATCH 1/4] [zep noup] ld: Reset linker '.' value after .ER_CODE_SRAM section When processing the .ER_CODE_SRAM section, the location counter is set to the VMA of that section, so after processing the next section will use that VMA instead of the next available address in the FLASH region. Reset the location counter to the next available FLASH address after processing this section will ensure that any subsequent FLASH data is placed in the correct location. This test fails without this patch: $ west build -p -b lpcxpresso55s69/lpc55s69/cpu0/ns \ samples/synchronization -T sample.kernel.synchronization .../ld: address 0x14003e84 of bin/tfm_s.axf section `.ER_TFM_CODE' is not within region `FLASH' .../ld: address 0x14005c20 of bin/tfm_s.axf section `.TFM_UNPRIV_CODE' is not within region `FLASH' .../ld: bin/tfm_s.axf section `.TFM_PSA_ROT_LINKER_DATA' will not fit in region `FLASH' .../ld: address 0x14003e84 of bin/tfm_s.axf section `.ER_TFM_CODE' is not within region `FLASH' .../ld: address 0x14005c20 of bin/tfm_s.axf section `.TFM_UNPRIV_CODE' is not within region `FLASH' .../ld: ERROR: CMSE stub (.gnu.sgstubs section) too far (0x10008540) from destination (0x14003ee4) Note that the linker is generating addresses within the CODE_RAM memory region rather than the FLASH region. Signed-off-by: Keith Packard --- platform/ext/common/gcc/tfm_common_s.ld.template | 3 +++ platform/ext/common/gcc/tfm_isolation_s.ld.template | 3 +++ platform/ext/common/llvm/tfm_isolation_s.ld.template | 3 +++ .../ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld | 4 ++++ .../ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld | 4 ++++ platform/ext/target/rpi/rp2350/linker_s.ld | 3 +++ 6 files changed, 20 insertions(+) diff --git a/platform/ext/common/gcc/tfm_common_s.ld.template b/platform/ext/common/gcc/tfm_common_s.ld.template index eee6de4286..b0095d8e60 100644 --- a/platform/ext/common/gcc/tfm_common_s.ld.template +++ b/platform/ext/common/gcc/tfm_common_s.ld.template @@ -200,6 +200,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); diff --git a/platform/ext/common/gcc/tfm_isolation_s.ld.template b/platform/ext/common/gcc/tfm_isolation_s.ld.template index 95c054f6a2..362b812ed3 100644 --- a/platform/ext/common/gcc/tfm_isolation_s.ld.template +++ b/platform/ext/common/gcc/tfm_isolation_s.ld.template @@ -350,6 +350,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); diff --git a/platform/ext/common/llvm/tfm_isolation_s.ld.template b/platform/ext/common/llvm/tfm_isolation_s.ld.template index 0b7e8d7aba..b6df8af774 100644 --- a/platform/ext/common/llvm/tfm_isolation_s.ld.template +++ b/platform/ext/common/llvm/tfm_isolation_s.ld.template @@ -323,6 +323,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld index c0878d790c..46c46eb626 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld @@ -58,6 +58,10 @@ SECTIONS *libflash_drivers.o(.rodata*) . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + Image$$ER_CODE_SRAM$$Base = ADDR(.ER_CODE_SRAM); Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld index 09aef8d9c6..2cf14e0511 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld @@ -57,6 +57,10 @@ SECTIONS *libflash_drivers.o(.rodata*) . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + Image$$ER_CODE_SRAM$$Base = ADDR(.ER_CODE_SRAM); Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); diff --git a/platform/ext/target/rpi/rp2350/linker_s.ld b/platform/ext/target/rpi/rp2350/linker_s.ld index 084b1fc67c..fad054fa91 100644 --- a/platform/ext/target/rpi/rp2350/linker_s.ld +++ b/platform/ext/target/rpi/rp2350/linker_s.ld @@ -150,6 +150,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); From 35b61e6f57204304a231bb903fa20dea7f22ef4f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 29 Oct 2025 08:57:09 -0700 Subject: [PATCH 2/4] [zep noup] platform: Include TFM_BSS in zero table for link script templates While the copy table included the default data segment for these templates, the zero table didn't include the default bss segment. Make sure that area gets initialized to zero using the table-based mechanism instead of relying on the startup code to initialize it explicitly. Signed-off-by: Keith Packard --- platform/ext/common/gcc/tfm_common_s.ld.template | 3 +++ platform/ext/common/gcc/tfm_isolation_s.ld.template | 3 +++ 2 files changed, 6 insertions(+) diff --git a/platform/ext/common/gcc/tfm_common_s.ld.template b/platform/ext/common/gcc/tfm_common_s.ld.template index b0095d8e60..5db39407c4 100644 --- a/platform/ext/common/gcc/tfm_common_s.ld.template +++ b/platform/ext/common/gcc/tfm_common_s.ld.template @@ -276,6 +276,9 @@ SECTIONS /* .zero.table */ . = ALIGN(4); __zero_table_start__ = .; + LONG (ADDR(.TFM_BSS)) + LONG (SIZEOF(.TFM_BSS) / 4) + LONG (ADDR(.TFM_PSA_ROT_LINKER_BSS)) LONG (SIZEOF(.TFM_PSA_ROT_LINKER_BSS) / 4) /* Aligment checked after the section */ diff --git a/platform/ext/common/gcc/tfm_isolation_s.ld.template b/platform/ext/common/gcc/tfm_isolation_s.ld.template index 362b812ed3..c318b73493 100644 --- a/platform/ext/common/gcc/tfm_isolation_s.ld.template +++ b/platform/ext/common/gcc/tfm_isolation_s.ld.template @@ -264,6 +264,9 @@ SECTIONS /* .zero.table */ . = ALIGN(4); __zero_table_start__ = .; + LONG (ADDR(.TFM_BSS)) + LONG (SIZEOF(.TFM_BSS) / 4) + {% for partition in partitions %} LONG (ADDR(.ER_{{partition.manifest.name}}_BSS)) LONG (SIZEOF(.ER_{{partition.manifest.name}}_BSS) / 4) /* Aligment checked after the section */ From 76155d0608b8676fc30df2a17a10fb00f7b65017 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 28 Oct 2025 15:27:55 -0700 Subject: [PATCH 3/4] [zep noup] platform: Add picolibc init and heap symbols to linker scripts Picolibc uses different names for the list of constructors and heap limits. Add values for __bothinit_array_start, __bothinit_array_end, __heap_start and __heap_end to every linker script. If not using picolibc, these will not have any effect. Signed-off-by: Keith Packard --- platform/ext/common/gcc/tfm_common_bl2.ld | 4 ++++ platform/ext/common/gcc/tfm_common_ns.ld | 4 ++++ platform/ext/common/gcc/tfm_common_s.ld.template | 4 ++++ platform/ext/common/gcc/tfm_isolation_s.ld.template | 4 ++++ platform/ext/common/llvm/tfm_common_ns.ldc | 2 ++ platform/ext/common/llvm/tfm_isolation_s.ld.template | 2 ++ .../ext/target/adi/max32657/device/gcc/max32657_sla.ld | 4 ++++ .../corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld | 4 ++++ .../corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld | 4 ++++ .../common/device/source/gcc/mps4_corstone3xx_bl1_1.ld | 4 ++++ .../common/device/source/gcc/mps4_corstone3xx_bl1_2.ld | 4 ++++ .../target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld | 4 ++++ .../ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld | 4 ++++ .../target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc | 2 ++ .../target/arm/rse/common/device/source/gcc/rse_bl1_1.ld | 4 ++++ .../target/arm/rse/common/device/source/gcc/rse_bl1_2.ld | 4 ++++ .../arm/rse/common/tests/rse_test_executable/rse_tests.ld | 4 ++++ .../target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld | 4 ++++ .../target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld | 4 ++++ .../target/nuvoton/m2351/device/source/gcc/m2351_ns.ld | 4 ++++ .../target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld | 4 ++++ .../target/nuvoton/m2354/device/source/gcc/m2354_ns.ld | 4 ++++ platform/ext/target/rpi/rp2350/linker_bl2.ld | 4 ++++ platform/ext/target/rpi/rp2350/linker_ns.ld | 4 ++++ platform/ext/target/rpi/rp2350/linker_s.ld | 4 ++++ .../ext/target/stm/common/hal/template/gcc/appli_ns.ld | 4 ++++ platform/ext/target/stm/common/hal/template/gcc/bl2.ld | 4 ++++ .../common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld | 8 ++++++++ .../ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld | 4 ++++ .../common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld | 8 ++++++++ .../common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld | 8 ++++++++ 31 files changed, 130 insertions(+) diff --git a/platform/ext/common/gcc/tfm_common_bl2.ld b/platform/ext/common/gcc/tfm_common_bl2.ld index aa09da982d..8f095fa99f 100644 --- a/platform/ext/common/gcc/tfm_common_bl2.ld +++ b/platform/ext/common/gcc/tfm_common_bl2.ld @@ -60,6 +60,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -69,6 +70,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -212,8 +214,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/common/gcc/tfm_common_ns.ld b/platform/ext/common/gcc/tfm_common_ns.ld index dd303d9dca..41dbce9d77 100644 --- a/platform/ext/common/gcc/tfm_common_ns.ld +++ b/platform/ext/common/gcc/tfm_common_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -158,8 +160,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/common/gcc/tfm_common_s.ld.template b/platform/ext/common/gcc/tfm_common_s.ld.template index 5db39407c4..2c47b04076 100644 --- a/platform/ext/common/gcc/tfm_common_s.ld.template +++ b/platform/ext/common/gcc/tfm_common_s.ld.template @@ -228,6 +228,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -237,6 +238,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -412,8 +414,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif diff --git a/platform/ext/common/gcc/tfm_isolation_s.ld.template b/platform/ext/common/gcc/tfm_isolation_s.ld.template index c318b73493..adda9b4b7c 100644 --- a/platform/ext/common/gcc/tfm_isolation_s.ld.template +++ b/platform/ext/common/gcc/tfm_isolation_s.ld.template @@ -218,6 +218,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -227,6 +228,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -516,8 +518,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif diff --git a/platform/ext/common/llvm/tfm_common_ns.ldc b/platform/ext/common/llvm/tfm_common_ns.ldc index 4ba14fb8d8..d73fbce8ee 100644 --- a/platform/ext/common/llvm/tfm_common_ns.ldc +++ b/platform/ext/common/llvm/tfm_common_ns.ldc @@ -42,6 +42,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -51,6 +52,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/common/llvm/tfm_isolation_s.ld.template b/platform/ext/common/llvm/tfm_isolation_s.ld.template index b6df8af774..fbef56ed83 100644 --- a/platform/ext/common/llvm/tfm_isolation_s.ld.template +++ b/platform/ext/common/llvm/tfm_isolation_s.ld.template @@ -192,6 +192,7 @@ SECTIONS { /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -201,6 +202,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld b/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld index 10a91a559f..7a07617d42 100644 --- a/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld +++ b/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -196,8 +198,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld index 08b5e8d3ce..c1a2b7bd35 100644 --- a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld +++ b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -172,8 +174,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld index 01998bf37e..3da19618c6 100644 --- a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld +++ b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -176,8 +178,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld index 44f04021a5..286883de84 100644 --- a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld +++ b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -191,8 +193,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld index 83aaf144f7..c9a62f3278 100644 --- a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld +++ b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -192,8 +194,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld index 46c46eb626..16ccbb5193 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld @@ -72,6 +72,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -81,6 +82,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -208,8 +210,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld index 04634359de..128d29dfbc 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -164,8 +166,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc index 5c7ad897cb..7e1ad8d668 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc +++ b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc @@ -43,6 +43,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -52,6 +53,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld index 8b92674ede..20e5636c65 100644 --- a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld +++ b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld @@ -48,6 +48,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -57,6 +58,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -181,8 +183,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld index bff127a214..cacae46b00 100644 --- a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld +++ b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -174,8 +176,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld b/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld index d5b00b465e..c095bce81d 100644 --- a/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld +++ b/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -173,8 +175,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld b/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld index c839303458..16e8f910be 100644 --- a/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld +++ b/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld @@ -116,6 +116,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -125,6 +126,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -267,11 +269,13 @@ SECTIONS .heap (NOLOAD): { __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); __end__ = .; PROVIDE(end = .); end = __end__; . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > ram diff --git a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld index fd72a3e55a..8525948b5a 100644 --- a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld +++ b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -171,8 +173,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld index 42cd99082f..b198da6f4b 100644 --- a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld +++ b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -157,8 +159,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld index fd72a3e55a..8525948b5a 100644 --- a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld +++ b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -171,8 +173,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld index 42cd99082f..b198da6f4b 100644 --- a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld +++ b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -157,8 +159,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/rpi/rp2350/linker_bl2.ld b/platform/ext/target/rpi/rp2350/linker_bl2.ld index 5dfd04ce92..e958204428 100644 --- a/platform/ext/target/rpi/rp2350/linker_bl2.ld +++ b/platform/ext/target/rpi/rp2350/linker_bl2.ld @@ -39,6 +39,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -48,6 +49,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ PROVIDE_HIDDEN (__fini_array_start = .); @@ -241,9 +243,11 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); KEEP(*(.heap*)) . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/rpi/rp2350/linker_ns.ld b/platform/ext/target/rpi/rp2350/linker_ns.ld index 3e2744352d..1485d85119 100644 --- a/platform/ext/target/rpi/rp2350/linker_ns.ld +++ b/platform/ext/target/rpi/rp2350/linker_ns.ld @@ -67,6 +67,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -77,6 +78,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -196,8 +198,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/rpi/rp2350/linker_s.ld b/platform/ext/target/rpi/rp2350/linker_s.ld index fad054fa91..8a07cb8ec1 100644 --- a/platform/ext/target/rpi/rp2350/linker_s.ld +++ b/platform/ext/target/rpi/rp2350/linker_s.ld @@ -200,6 +200,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -210,6 +211,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -379,9 +381,11 @@ SECTIONS end = __end__; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); KEEP(*(.heap*)) . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; } > RAM #else diff --git a/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld b/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld index 833c1aa042..96e340e977 100644 --- a/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld +++ b/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -170,8 +172,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/hal/template/gcc/bl2.ld b/platform/ext/target/stm/common/hal/template/gcc/bl2.ld index 04910acd3b..97b94daf96 100644 --- a/platform/ext/target/stm/common/hal/template/gcc/bl2.ld +++ b/platform/ext/target/stm/common/hal/template/gcc/bl2.ld @@ -88,6 +88,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -97,6 +98,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -202,8 +204,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld index 930d7b4ae3..391b375a30 100644 --- a/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld @@ -219,8 +219,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -249,8 +251,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -261,8 +265,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ @@ -318,6 +324,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -327,6 +334,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld b/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld index 74ccad1f58..132e53fb62 100644 --- a/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld +++ b/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld @@ -78,6 +78,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -87,6 +88,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -192,8 +194,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld index 591c193c17..f56d4e52c5 100644 --- a/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld @@ -108,6 +108,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -117,6 +118,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -238,8 +240,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -268,8 +272,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -280,8 +286,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ diff --git a/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld index ce3d9f0491..2febd57d77 100644 --- a/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld @@ -119,6 +119,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -128,6 +129,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -249,8 +251,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -279,8 +283,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -291,8 +297,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ From 6b820c4a70129f995b18ef868fbcf3ab15cc5e50 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 19 May 2025 15:54:48 -0700 Subject: [PATCH 4/4] [zep noup] Use picolibc instead of newlib-nano 1. Support picolibc stdio. There was already picolibc support code present in the library for the ARM LLVM toolchain. The conditionals which selected it have been changed to use __PICOLIBC__ instead of __clang_major__. 2. Add _exit stub. Code using assert or abort end up calling _exit through the picolibc signal handling code. 3. Switch to picolibc.specs. This is needed for toolchains which don't use picolibc by default, and can also be used without trouble in toolchains where picolibc is the default. 4. Define CONFIG_PICOLIBC when using picolibc. This is enabled by default, but can be disabled on the cmake command line. 5. Define picolibc_startup to initialize all .data and .bss segments using the standard tf-m arrays. 6. Add picolibc.c to many source lists when CONFIG_PICOLIBC is defined. If this file is missign, picolibc_startup will not be defined which should cause a failure at link time. Signed-off-by: Keith Packard --- bl1/bl1_1/CMakeLists.txt | 1 + bl1/bl1_2/CMakeLists.txt | 1 + bl2/CMakeLists.txt | 1 + cmake/install.cmake | 5 ++ cmake/spe-CMakeLists.cmake | 1 + platform/CMakeLists.txt | 4 ++ platform/ext/common/picolibc.c | 56 +++++++++++++++++++ .../common/provisioning_bundle/CMakeLists.txt | 1 + platform/ext/common/syscalls_stub.c | 10 ++++ platform/ext/common/uart_stdout.c | 2 +- .../provisioning/bundle_cm/CMakeLists.txt | 1 + .../provisioning/bundle_dm/CMakeLists.txt | 1 + .../common/provisioning/bundle/CMakeLists.txt | 1 + .../mps3/common/provisioning/CMakeLists.txt | 1 + platform/ns/toolchain_ns_GNUARM.cmake | 31 ++++++++-- .../partitions/lib/runtime/CMakeLists.txt | 1 + toolchain_GNUARM.cmake | 31 ++++++++-- 17 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 platform/ext/common/picolibc.c diff --git a/bl1/bl1_1/CMakeLists.txt b/bl1/bl1_1/CMakeLists.txt index ab14336312..08ebc942f0 100644 --- a/bl1/bl1_1/CMakeLists.txt +++ b/bl1/bl1_1/CMakeLists.txt @@ -40,6 +40,7 @@ target_link_options(bl1_1 target_sources(bl1_1 PRIVATE main.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/bl1/bl1_2/CMakeLists.txt b/bl1/bl1_2/CMakeLists.txt index 23fe370804..2d19e70d9d 100644 --- a/bl1/bl1_2/CMakeLists.txt +++ b/bl1/bl1_2/CMakeLists.txt @@ -42,6 +42,7 @@ target_link_options(bl1_2 target_sources(bl1_2 PRIVATE main.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/bl2/CMakeLists.txt b/bl2/CMakeLists.txt index b462dfee18..21dfa2e3b3 100644 --- a/bl2/CMakeLists.txt +++ b/bl2/CMakeLists.txt @@ -141,6 +141,7 @@ add_executable(bl2 $<$:src/default_flash_map.c> $<$:src/shared_data.c> $<$:src/provisioning.c> + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/cmake/install.cmake b/cmake/install.cmake index dc60e2bc26..c5faabeb9d 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -254,6 +254,11 @@ install(DIRECTORY $ $ DESTINATION ${INSTALL_PLATFORM_NS_DIR}/ext/cmsis) +if(CONFIG_PICOLIBC) + install(FILES ${PLATFORM_DIR}/ext/common/picolibc.c + DESTINATION ${INSTALL_PLATFORM_NS_DIR}/ext/common) +endif() + if(PLATFORM_DEFAULT_UART_STDOUT) install(FILES ${PLATFORM_DIR}/ext/common/uart_stdout.c ${PLATFORM_DIR}/ext/common/uart_stdout.h diff --git a/cmake/spe-CMakeLists.cmake b/cmake/spe-CMakeLists.cmake index c342f4a3de..23dcd6d4a6 100644 --- a/cmake/spe-CMakeLists.cmake +++ b/cmake/spe-CMakeLists.cmake @@ -104,6 +104,7 @@ add_subdirectory(platform) target_sources(platform_ns PRIVATE + $<$:${CMAKE_CURRENT_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_CURRENT_SOURCE_DIR}/platform/ext/common/uart_stdout.c> ) diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index 15367499f8..2ea8ed6bf0 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -81,6 +81,7 @@ target_sources(platform_s $<$:ext/common/provisioning.c> $<$,$>:${CMAKE_SOURCE_DIR}/platform/ext/common/test_interrupt.c> $<$:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -203,6 +204,7 @@ if(BL2) $<$,$>:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> $<$:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -304,6 +306,7 @@ if(BL1 AND PLATFORM_DEFAULT_BL1) $<$:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> $<$,$>:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -359,6 +362,7 @@ if(BL1 AND PLATFORM_DEFAULT_BL1) $<$:ext/common/template/nv_counters.c> $<$,$>:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> + $<$:ext/common/picolibc.c> ) target_link_libraries(platform_bl1_2 diff --git a/platform/ext/common/picolibc.c b/platform/ext/common/picolibc.c new file mode 100644 index 0000000000..9789dc9b1e --- /dev/null +++ b/platform/ext/common/picolibc.c @@ -0,0 +1,56 @@ +/* + * Copyright 2025, Keith Packard + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include +#include "config_impl.h" + +#ifdef __PICOLIBC__ + +/* + * Picolibc's startup code only initializes a single data and bss + * segment. Replace that to initialize all of the segments using + * the lists provided by the linker script. + */ + +void __libc_init_array(void); +void _start(void); +int main(int, char **); + +void +_start(void) +{ + typedef struct __copy_table { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct __zero_table { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + memcpy(pTable->dest, pTable->src, pTable->wlen << 2); + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + memset(pTable->dest, 0, pTable->wlen << 2); + } + + __libc_init_array(); + main(0, NULL); + return; +} + +#endif /* __PICOLIBC__ */ diff --git a/platform/ext/common/provisioning_bundle/CMakeLists.txt b/platform/ext/common/provisioning_bundle/CMakeLists.txt index 220b1a902a..83cc7379ee 100644 --- a/platform/ext/common/provisioning_bundle/CMakeLists.txt +++ b/platform/ext/common/provisioning_bundle/CMakeLists.txt @@ -54,6 +54,7 @@ target_sources(provisioning_bundle PRIVATE ./provisioning_code.c ./provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/common/syscalls_stub.c b/platform/ext/common/syscalls_stub.c index 9ebe78e97e..7256b774b3 100644 --- a/platform/ext/common/syscalls_stub.c +++ b/platform/ext/common/syscalls_stub.c @@ -14,6 +14,14 @@ #include #include +#ifdef __PICOLIBC__ +__attribute__((weak)) +void _exit(int status) +{ + (void) status; + for(;;); +} +#else __attribute__((weak)) void _close(void) { @@ -53,3 +61,5 @@ __attribute__((weak)) void _write(void) { } + +#endif /* !__PICOLIBC__ */ diff --git a/platform/ext/common/uart_stdout.c b/platform/ext/common/uart_stdout.c index fec035ada7..e1fdb82f27 100644 --- a/platform/ext/common/uart_stdout.c +++ b/platform/ext/common/uart_stdout.c @@ -85,7 +85,7 @@ int fputc(int ch, FILE *f) /* Redirect sdtio for PicoLib in LLVM toolchain as per https://github.com/picolibc/picolibc/blob/main/doc/os.md 'fputch()' named intentionally different from 'fputc()' from picolib */ -#elif defined(__clang_major__) +#elif defined(__PICOLIBC__) int fputch(char ch, struct __file *f) { diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt index 80626cd5e2..f25f076448 100644 --- a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt +++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources(cm_provisioning_bundle PRIVATE cm_provisioning_code.c cm_provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt index 5a8614b8e6..a1fe359334 100644 --- a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt +++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt @@ -65,6 +65,7 @@ target_sources(dm_provisioning_bundle PRIVATE dm_provisioning_code.c dm_provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt b/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt index c4aa7e0272..e2a86ef677 100644 --- a/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt +++ b/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt @@ -67,6 +67,7 @@ macro(create_provisioning_code_target target) target_sources(${target}_provisioning_code PRIVATE + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt b/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt index 4e4e72f344..cb020fd623 100644 --- a/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt +++ b/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt @@ -50,6 +50,7 @@ target_sources(provisioning_bundle PRIVATE ./provisioning_code.c ./provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ns/toolchain_ns_GNUARM.cmake b/platform/ns/toolchain_ns_GNUARM.cmake index 8f23f818bc..202955dced 100644 --- a/platform/ns/toolchain_ns_GNUARM.cmake +++ b/platform/ns/toolchain_ns_GNUARM.cmake @@ -176,9 +176,32 @@ string(APPEND CMAKE_ASM_LINK_FLAGS " " ${LINKER_CP_OPTION}) # For GNU Arm Embedded Toolchain doesn't emit __ARM_ARCH_8_1M_MAIN__, adding this macro manually. add_compile_definitions($<$:__ARM_ARCH_8_1M_MAIN__=1>) +if(NOT DEFINED CONFIG_PICOLIBC) + set(CONFIG_PICOLIBC TRUE) +endif() + +if (CONFIG_PICOLIBC) + set(LIBC_COMPILE_OPTIONS + -specs=picolibc.specs + ) + set(LIBC_LINK_OPTIONS + -specs=picolibc.specs + -nostartfiles + -u main + ) +else() + set(LIBC_COMPILE_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) + set(LIBC_LINK_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) +endif() + add_compile_options( - -specs=nano.specs - -specs=nosys.specs + ${LIBC_COMPILE_OPTIONS} -Wall -Wno-format -Warray-parameter @@ -200,8 +223,8 @@ add_compile_options( add_link_options( --entry=Reset_Handler - -specs=nano.specs - -specs=nosys.specs + ${LIBC_LINK_OPTIONS} + -mthumb LINKER:-check-sections LINKER:-fatal-warnings LINKER:--gc-sections diff --git a/secure_fw/partitions/lib/runtime/CMakeLists.txt b/secure_fw/partitions/lib/runtime/CMakeLists.txt index 12e3116148..a5d2cf6aca 100644 --- a/secure_fw/partitions/lib/runtime/CMakeLists.txt +++ b/secure_fw/partitions/lib/runtime/CMakeLists.txt @@ -18,6 +18,7 @@ target_include_directories(tfm_sprt target_sources(tfm_sprt PUBLIC + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> PRIVATE crt_memcmp.c diff --git a/toolchain_GNUARM.cmake b/toolchain_GNUARM.cmake index 46e28b4ab2..53bffaebd6 100644 --- a/toolchain_GNUARM.cmake +++ b/toolchain_GNUARM.cmake @@ -106,9 +106,32 @@ if(GCC_VERSION VERSION_GREATER_EQUAL "8.0.0") endif() endif() +if(NOT DEFINED CONFIG_PICOLIBC) + set(CONFIG_PICOLIBC TRUE) +endif() + +if (CONFIG_PICOLIBC) + set(LIBC_COMPILE_OPTIONS + -specs=picolibc.specs + ) + set(LIBC_LINK_OPTIONS + -specs=picolibc.specs + -nostartfiles + -u main + ) +else() + set(LIBC_COMPILE_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) + set(LIBC_LINK_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) +endif() + add_compile_options( - -specs=nano.specs - -specs=nosys.specs + ${LIBC_COMPILE_OPTIONS} -Wall -Wno-format -Warray-parameter @@ -147,8 +170,8 @@ endif() add_link_options( --entry=Reset_Handler - -specs=nano.specs - -specs=nosys.specs + ${LIBC_LINK_OPTIONS} + -mthumb LINKER:-check-sections LINKER:-fatal-warnings LINKER:--gc-sections