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..f4cf41ba3 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 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}) 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..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 @@ -35,6 +36,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 +48,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..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 */ @@ -51,6 +52,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 +64,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..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 @@ -30,6 +31,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 +43,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE_HIDDEN (__bothinit_array_end = .); . = ALIGN(4); /* finit data */