From cd3b296b1442e63aaf336a2876e0d6aa79185f93 Mon Sep 17 00:00:00 2001 From: graham sanderson Date: Mon, 13 Apr 2026 15:16:29 -0500 Subject: [PATCH 1/4] Fix basic picolibc support --- src/rp2040/boot_stage2/CMakeLists.txt | 1 + src/rp2350/boot_stage2/CMakeLists.txt | 1 + src/rp2_common/pico_clib_interface/picolibc_interface.c | 6 ++++++ src/rp2_common/pico_cxx_options/new_delete.cpp | 1 + .../pico_platform_compiler/include/pico/platform/compiler.h | 3 +++ src/rp2_common/pico_runtime/CMakeLists.txt | 5 ++++- src/rp2_common/pico_standard_link/CMakeLists.txt | 3 ++- .../script_include/section_copy_to_ram_data.incl | 2 ++ .../script_include/section_default_text.incl | 2 ++ .../script_include/section_no_flash_data.incl | 2 ++ 10 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/rp2040/boot_stage2/CMakeLists.txt b/src/rp2040/boot_stage2/CMakeLists.txt index 2798b3640..36dfe843f 100644 --- a/src/rp2040/boot_stage2/CMakeLists.txt +++ b/src/rp2040/boot_stage2/CMakeLists.txt @@ -49,6 +49,7 @@ function(pico_define_boot_stage2 NAME SOURCES) if (PICO_C_COMPILER_IS_CLANG) target_link_options(${NAME} PRIVATE "-nostdlib") elseif (PICO_C_COMPILER_IS_GNU) + # this disables newlib's implementation of syscalls such as _read target_link_options(${NAME} PRIVATE "--specs=nosys.specs") target_link_options(${NAME} PRIVATE "-nostartfiles") endif () diff --git a/src/rp2350/boot_stage2/CMakeLists.txt b/src/rp2350/boot_stage2/CMakeLists.txt index fbf95b53a..993e6f4e0 100644 --- a/src/rp2350/boot_stage2/CMakeLists.txt +++ b/src/rp2350/boot_stage2/CMakeLists.txt @@ -49,6 +49,7 @@ function(pico_define_boot_stage2 NAME SOURCES) if (PICO_C_COMPILER_IS_CLANG) target_link_options(${NAME} PRIVATE "-nostdlib") elseif (PICO_C_COMPILER_IS_GNU) + # this disables newlib's implementation of syscalls such as _read target_link_options(${NAME} PRIVATE "--specs=nosys.specs") target_link_options(${NAME} PRIVATE "-nostartfiles") endif () diff --git a/src/rp2_common/pico_clib_interface/picolibc_interface.c b/src/rp2_common/pico_clib_interface/picolibc_interface.c index 63d79135e..a0e1e08f5 100644 --- a/src/rp2_common/pico_clib_interface/picolibc_interface.c +++ b/src/rp2_common/pico_clib_interface/picolibc_interface.c @@ -58,6 +58,12 @@ static FILE __stdio = FDEV_SETUP_STREAM(picolibc_putc, picolibc_flush, _FDEV_SETUP_RW); +#ifdef __GNUCLIKE_PRAGMA_DIAGNOSTIC +#pragma GCC diagnostic ignored "-Wpragmas" +#pragma GCC diagnostic ignored "-Wunknown-warning-option" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + FILE *const stdin = &__stdio; __strong_reference(stdin, stdout); __strong_reference(stdin, stderr); void __weak __assert_func(const char *file, int line, const char *func, const char *failedexpr) { diff --git a/src/rp2_common/pico_cxx_options/new_delete.cpp b/src/rp2_common/pico_cxx_options/new_delete.cpp index 19adddab3..abf54f3a6 100644 --- a/src/rp2_common/pico_cxx_options/new_delete.cpp +++ b/src/rp2_common/pico_cxx_options/new_delete.cpp @@ -8,6 +8,7 @@ // Override the standard allocators to use regular malloc/free #if !PICO_CXX_DISABLE_ALLOCATION_OVERRIDES // Let user override +#include // weird looking but it is required if dropping picolibc on top of GCC+newlib (reent issue) #include #include "pico.h" diff --git a/src/rp2_common/pico_platform_compiler/include/pico/platform/compiler.h b/src/rp2_common/pico_platform_compiler/include/pico/platform/compiler.h index 7f24008a2..a9295471a 100644 --- a/src/rp2_common/pico_platform_compiler/include/pico/platform/compiler.h +++ b/src/rp2_common/pico_platform_compiler/include/pico/platform/compiler.h @@ -21,6 +21,9 @@ #if defined __GNUC__ #include +#if !defined(__printflike) && defined(__picolibc_format) +#define __printflike(a,b) __picolibc_format(printf,a,b) +#endif // note LLVM defines __GNUC__ #ifdef __clang__ #define PICO_C_COMPILER_IS_CLANG 1 diff --git a/src/rp2_common/pico_runtime/CMakeLists.txt b/src/rp2_common/pico_runtime/CMakeLists.txt index e190d5106..793a1661b 100644 --- a/src/rp2_common/pico_runtime/CMakeLists.txt +++ b/src/rp2_common/pico_runtime/CMakeLists.txt @@ -46,7 +46,10 @@ endforeach() # todo is this correct/needed? if (PICO_C_COMPILER_IS_GNU) - target_link_options(pico_runtime INTERFACE "--specs=nosys.specs") + if (PICO_LIBC STREQUAL "newlib") + # this disables newlib's implementation of syscalls such as _read + target_link_options(pico_runtime INTERFACE "--specs=nosys.specs") + endif() elseif (PICO_C_COMPILER_IS_CLANG) # target_link_options(pico_runtime INTERFACE "-nostdlib") endif() diff --git a/src/rp2_common/pico_standard_link/CMakeLists.txt b/src/rp2_common/pico_standard_link/CMakeLists.txt index 6ebcd4d3d..c3602fd0f 100644 --- a/src/rp2_common/pico_standard_link/CMakeLists.txt +++ b/src/rp2_common/pico_standard_link/CMakeLists.txt @@ -178,7 +178,8 @@ if (NOT TARGET pico_standard_link) # if PICO_TARGET_BINARY_TYPE is set to foo on the target, otherwise ${CMAKE_CURRENT_LIST_DIR}/memmap_${PICO_DEFAULT_BINARY_TYPE).ld set(_LINKER_SCRIPT_EXPRESSION "$>,$,${PICO_LINKER_SCRIPT_PATH}/memmap_$,>,${PICO_DEFAULT_BINARY_TYPE},$>.ld>") target_link_options(pico_standard_link INTERFACE - "LINKER:--script=${_LINKER_SCRIPT_EXPRESSION}" + # use T instead of --script here,as picolibc.specs looks for -T not --linker + "-T${_LINKER_SCRIPT_EXPRESSION}" ) pico_add_link_depend(pico_standard_link ${_LINKER_SCRIPT_EXPRESSION}) unset(_LINKER_SCRIPT_EXPRESSION) diff --git a/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl b/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl index 60890c885..c568e16c8 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl @@ -35,6 +35,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -46,6 +47,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE_HIDDEN (__bothinit_array_end = .); . = ALIGN(4); /* finit data */ diff --git a/src/rp2_common/pico_standard_link/script_include/section_default_text.incl b/src/rp2_common/pico_standard_link/script_include/section_default_text.incl index 911cafab2..b67148edb 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_default_text.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_default_text.incl @@ -51,6 +51,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -62,6 +63,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE_HIDDEN (__bothinit_array_end = .); . = ALIGN(4); /* finit data */ diff --git a/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl b/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl index 57c38782f..b68e50bd7 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl @@ -30,6 +30,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -41,6 +42,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE_HIDDEN (__bothinit_array_end = .); . = ALIGN(4); /* finit data */ From ad0fda9c1562d1ecb13aac09ffbf02f6ab323272 Mon Sep 17 00:00:00 2001 From: graham sanderson Date: Wed, 15 Apr 2026 11:08:36 -0500 Subject: [PATCH 2/4] update linker script comments --- .../script_include/section_copy_to_ram_data.incl | 1 + .../pico_standard_link/script_include/section_default_text.incl | 1 + .../pico_standard_link/script_include/section_no_flash_data.incl | 1 + 3 files changed, 3 insertions(+) diff --git a/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl b/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl index c568e16c8..48b2914ae 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_copy_to_ram_data.incl @@ -3,6 +3,7 @@ __mutex_array_start, __mutex_array_end __preinit_array_start, __preinit_array_end __init_array_start, __init_array_end + __bothinit_array_start, __bothinit_array_end __fini_array_start, __fini_array_end __tdata_end __etext diff --git a/src/rp2_common/pico_standard_link/script_include/section_default_text.incl b/src/rp2_common/pico_standard_link/script_include/section_default_text.incl index b67148edb..52f42fe2e 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_default_text.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_default_text.incl @@ -4,6 +4,7 @@ __embedded_block_end __preinit_array_start, __preinit_array_end __init_array_start, __init_array_end + __bothinit_array_start, __bothinit_array_end __fini_array_start, __fini_array_end */ diff --git a/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl b/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl index b68e50bd7..8a1bcd5ec 100644 --- a/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl +++ b/src/rp2_common/pico_standard_link/script_include/section_no_flash_data.incl @@ -3,6 +3,7 @@ __mutex_array_start, __mutex_array_end __preinit_array_start, __preinit_array_end __init_array_start, __init_array_end + __bothinit_array_start, __bothinit_array_end __fini_array_start, __fini_array_end __tdata_end __etext From b6bd627e164ac866b2e1c56765b014789c93f87c Mon Sep 17 00:00:00 2001 From: graham sanderson Date: Wed, 15 Apr 2026 11:11:15 -0500 Subject: [PATCH 3/4] update comment --- src/rp2_common/pico_standard_link/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rp2_common/pico_standard_link/CMakeLists.txt b/src/rp2_common/pico_standard_link/CMakeLists.txt index c3602fd0f..eea2c5661 100644 --- a/src/rp2_common/pico_standard_link/CMakeLists.txt +++ b/src/rp2_common/pico_standard_link/CMakeLists.txt @@ -178,7 +178,7 @@ if (NOT TARGET pico_standard_link) # if PICO_TARGET_BINARY_TYPE is set to foo on the target, otherwise ${CMAKE_CURRENT_LIST_DIR}/memmap_${PICO_DEFAULT_BINARY_TYPE).ld set(_LINKER_SCRIPT_EXPRESSION "$>,$,${PICO_LINKER_SCRIPT_PATH}/memmap_$,>,${PICO_DEFAULT_BINARY_TYPE},$>.ld>") target_link_options(pico_standard_link INTERFACE - # use T instead of --script here,as picolibc.specs looks for -T not --linker + # use T instead of --script here, as picolibc.specs looks for any -T not --linker to suppress injection of its own linker script "-T${_LINKER_SCRIPT_EXPRESSION}" ) pico_add_link_depend(pico_standard_link ${_LINKER_SCRIPT_EXPRESSION}) From e7c45f7668dcb7db602f14343f6b2ecd965752d3 Mon Sep 17 00:00:00 2001 From: graham sanderson Date: Wed, 15 Apr 2026 11:11:27 -0500 Subject: [PATCH 4/4] update comment --- src/rp2_common/pico_standard_link/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rp2_common/pico_standard_link/CMakeLists.txt b/src/rp2_common/pico_standard_link/CMakeLists.txt index eea2c5661..f4cf41ba3 100644 --- a/src/rp2_common/pico_standard_link/CMakeLists.txt +++ b/src/rp2_common/pico_standard_link/CMakeLists.txt @@ -178,7 +178,7 @@ if (NOT TARGET pico_standard_link) # if PICO_TARGET_BINARY_TYPE is set to foo on the target, otherwise ${CMAKE_CURRENT_LIST_DIR}/memmap_${PICO_DEFAULT_BINARY_TYPE).ld set(_LINKER_SCRIPT_EXPRESSION "$>,$,${PICO_LINKER_SCRIPT_PATH}/memmap_$,>,${PICO_DEFAULT_BINARY_TYPE},$>.ld>") target_link_options(pico_standard_link INTERFACE - # use T instead of --script here, as picolibc.specs looks for any -T not --linker to suppress injection of its own linker script + # use -T instead of --script here, as picolibc.specs looks for any -T not --linker to suppress injection of its own linker script "-T${_LINKER_SCRIPT_EXPRESSION}" ) pico_add_link_depend(pico_standard_link ${_LINKER_SCRIPT_EXPRESSION})