diff --git a/src/rp2040/boot_stage2/CMakeLists.txt b/src/rp2040/boot_stage2/CMakeLists.txt index 2798b3640..eebfb600b 100644 --- a/src/rp2040/boot_stage2/CMakeLists.txt +++ b/src/rp2040/boot_stage2/CMakeLists.txt @@ -49,7 +49,9 @@ 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) - target_link_options(${NAME} PRIVATE "--specs=nosys.specs") + if (PICO_CLIB STREQUAL "newlib") + target_link_options(${NAME} PRIVATE "--specs=nosys.specs") + endif() 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..446ca12aa 100644 --- a/src/rp2350/boot_stage2/CMakeLists.txt +++ b/src/rp2350/boot_stage2/CMakeLists.txt @@ -49,7 +49,9 @@ 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) - target_link_options(${NAME} PRIVATE "--specs=nosys.specs") + if (PICO_CLIB STREQUAL "newlib") + target_link_options(${NAME} PRIVATE "--specs=nosys.specs") + endif() 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..ca74e038e 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) { @@ -151,4 +157,4 @@ PICO_RUNTIME_INIT_FUNC_PER_CORE(runtime_init_pre_core_tls_setup, PICO_RUNTIME_IN // "ldr r0, =__tls_base\n" // "bx lr\n" // ); -//} \ No newline at end of file +//} diff --git a/src/rp2_common/pico_crt0/rp2040/memmap_blocked_ram.ld b/src/rp2_common/pico_crt0/rp2040/memmap_blocked_ram.ld index 6f5000566..82772d39c 100644 --- a/src/rp2_common/pico_crt0/rp2040/memmap_blocked_ram.ld +++ b/src/rp2_common/pico_crt0/rp2040/memmap_blocked_ram.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -87,6 +89,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -98,6 +101,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_crt0/rp2040/memmap_copy_to_ram.ld b/src/rp2_common/pico_crt0/rp2040/memmap_copy_to_ram.ld index 842ebfd3c..405d03f41 100644 --- a/src/rp2_common/pico_crt0/rp2040/memmap_copy_to_ram.ld +++ b/src/rp2_common/pico_crt0/rp2040/memmap_copy_to_ram.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -155,6 +157,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -166,6 +169,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_crt0/rp2040/memmap_default.ld b/src/rp2_common/pico_crt0/rp2040/memmap_default.ld index 51254012d..546b96088 100644 --- a/src/rp2_common/pico_crt0/rp2040/memmap_default.ld +++ b/src/rp2_common/pico_crt0/rp2040/memmap_default.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -87,6 +89,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -98,6 +101,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_crt0/rp2040/memmap_no_flash.ld b/src/rp2_common/pico_crt0/rp2040/memmap_no_flash.ld index dbf006a8c..d7bd823d7 100644 --- a/src/rp2_common/pico_crt0/rp2040/memmap_no_flash.ld +++ b/src/rp2_common/pico_crt0/rp2040/memmap_no_flash.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -118,6 +120,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -129,6 +132,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_crt0/rp2350/memmap_copy_to_ram.ld b/src/rp2_common/pico_crt0/rp2350/memmap_copy_to_ram.ld index 44c69f3b9..a87f0edbd 100644 --- a/src/rp2_common/pico_crt0/rp2350/memmap_copy_to_ram.ld +++ b/src/rp2_common/pico_crt0/rp2350/memmap_copy_to_ram.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -173,6 +175,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -184,6 +187,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_crt0/rp2350/memmap_default.ld b/src/rp2_common/pico_crt0/rp2350/memmap_default.ld index bce316d14..157035222 100644 --- a/src/rp2_common/pico_crt0/rp2350/memmap_default.ld +++ b/src/rp2_common/pico_crt0/rp2350/memmap_default.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -77,6 +79,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -88,6 +91,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_crt0/rp2350/memmap_no_flash.ld b/src/rp2_common/pico_crt0/rp2350/memmap_no_flash.ld index 5bedf6d21..9d3b2f9ce 100644 --- a/src/rp2_common/pico_crt0/rp2350/memmap_no_flash.ld +++ b/src/rp2_common/pico_crt0/rp2350/memmap_no_flash.ld @@ -4,10 +4,12 @@ __exidx_end __etext __data_start__ + __bothinit_array_start __preinit_array_start __preinit_array_end __init_array_start __init_array_end + __bothinit_array_end __fini_array_start __fini_array_end __data_end__ @@ -121,6 +123,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ + PROVIDE_HIDDEN (__bothinit_array_start = .); PROVIDE_HIDDEN (__preinit_array_start = .); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) @@ -132,6 +135,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_platform_compiler/include/pico/platform/compiler.h b/src/rp2_common/pico_platform_compiler/include/pico/platform/compiler.h index 7f24008a2..00083b95e 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 +#ifdef __PICOLIBC__ +#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..8afb233dc 100644 --- a/src/rp2_common/pico_runtime/CMakeLists.txt +++ b/src/rp2_common/pico_runtime/CMakeLists.txt @@ -46,7 +46,9 @@ endforeach() # todo is this correct/needed? if (PICO_C_COMPILER_IS_GNU) - target_link_options(pico_runtime INTERFACE "--specs=nosys.specs") + if (PICO_CLIB STREQUAL "newlib") + target_link_options(${NAME} PRIVATE "--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 c16968bba..380618734 100644 --- a/src/rp2_common/pico_standard_link/CMakeLists.txt +++ b/src/rp2_common/pico_standard_link/CMakeLists.txt @@ -125,13 +125,13 @@ if (NOT TARGET pico_standard_link) set(PICO_FLASH_SIZE_BYTES_STRING "${PICO_FLASH_SIZE_BYTES}") configure_file(${CMAKE_CURRENT_LIST_DIR}/pico_flash_region.template.ld ${CMAKE_BINARY_DIR}/pico_flash_region.ld) # add include path for linker scripts - target_link_options(pico_standard_link INTERFACE "LINKER:-L${CMAKE_BINARY_DIR}") + target_link_options(pico_standard_link INTERFACE "-L${CMAKE_BINARY_DIR}") # LINKER script will be PICO_TARGET_LINKER_SCRIPT if set on target, or ${CMAKE_CURRENT_LIST_DIR}/memmap_foo.ld # 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}" + "-T${_LINKER_SCRIPT_EXPRESSION}" ) pico_add_link_depend(pico_standard_link ${_LINKER_SCRIPT_EXPRESSION}) unset(_LINKER_SCRIPT_EXPRESSION) @@ -191,4 +191,23 @@ if (NOT TARGET pico_standard_link) endif() endif() endif() + + # Convert pico-sdk printf variant selection into picolibc version + # when using pico_printf_compiler + + if (PICO_CLIB STREQUAL "picolibc") + if (RUNTIME_INCLUDE_PRINTF_MINIMAL) + target_link_options(pico_standard_link INTERFACE + $<$,pico_printf_compiler>:--printf=m>) + elseif (RUNTIME_INCLUDE_PRINTF_FLOAT) + # this is the default + elseif (RUNTIME_INCLUDE_PRINTF_LONG_LONG) + target_link_options(pico_standard_link INTERFACE + $<$,pico_printf_compiler>:--printf=l>) + else() + target_link_options(pico_standard_link INTERFACE + $<$,pico_printf_compiler>:--printf=i>) + endif() + endif() + endif()