This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

GCC 12.2 libc_nano exporting retargetable locking functions and data

Hi,

While upgrading a project from the 11.2 to 12.2 releases of the GNU ARM Embedded toolchain, I'm encountering a problem:


[344/346] cmd.exe /C "cd . && C:\tools\jetbrains\apps\CLion\ch-0\223.8617.54\bin\cmake\win\x64\bin\cmake.exe -E rm -f ext\soup\hal\libstm32h7_hal_resmgr.a && C:\PROGRA~2\ARMGNU~1\12DBAB~1.2RE\bin\ARM-NO~2.EXE qc ext\soup\hal\libstm32h7_hal_resmgr.a  ext/soup/hal/CMakeFiles/stm32h7_hal_resmgr.dir/STM32CubeH7/Utilities/ResourcesManager/res_mgr.c.obj && C:\PROGRA~2\ARMGNU~1\12DBAB~1.2RE\bin\AR17F9~1.EXE ext\soup\hal\libstm32h7_hal_resmgr.a && cd ."
[345/346] cmd.exe /C "cd . && C:\PROGRA~2\ARMGNU~1\12DBAB~1.2RE\bin\AR19DD~1.EXE -O0 -g3 -DDEBUG -TC:/src/h7-eval/CM4/STM32H757XIHX_FLASH.ld -Wl,--cref -Wl,--print-memory-usage -Wl,-Map=C:/src/cmake-build-h7m4-debug-gnu-arm-113/h7-eval/CM4/h7-eval-m4.map -mthumb -mcpu=cortex-m4 -mabi=aapcs --specs=nano.specs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -static -Wl,--start-group -lc -lm -Wl,--end-group h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/Common/Src/system_stm32h7xx_dualcore_boot_cm4_cm7.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/adc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/crc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/cryp.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/dcmi.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/dma2d.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/eth.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/fmc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/gpio.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/hash.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/i2c.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/main.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/resmgr_utility.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/rng.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/spi.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/stm32h7xx_hal_msp.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/stm32h7xx_it.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/syscalls.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/sysmem.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/tim.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/usart.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Startup/startup_stm32h757xihx.s.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/ThreadX/tx_initialize_low_level.S.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/ThreadX/stm32h7xx_hal_timebase_tim.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/__/ext/soup/threadx/threadx/utility/execution_profile_kit/tx_execution_profile.c.obj -o h7-eval\CM4\h7-eval-m4.elf  ext/soup/hal/libstm32h7_hal.a  ext/soup/hal/libstm32h7_hal_resmgr.a  ext/soup/threadx/threadx/libthreadx.a  ext/soup/hal/libstm32h7_hal.a && cd ."
FAILED: h7-eval/CM4/h7-eval-m4.elf 
cmd.exe /C "cd . && C:\PROGRA~2\ARMGNU~1\12DBAB~1.2RE\bin\AR19DD~1.EXE -O0 -g3 -DDEBUG -TC:/src/h7-eval/CM4/STM32H757XIHX_FLASH.ld -Wl,--cref -Wl,--print-memory-usage -Wl,-Map=C:/src/cmake-build-h7m4-debug-gnu-arm-113/h7-eval/CM4/h7-eval-m4.map -mthumb -mcpu=cortex-m4 -mabi=aapcs --specs=nano.specs -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -static -Wl,--start-group -lc -lm -Wl,--end-group h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/Common/Src/system_stm32h7xx_dualcore_boot_cm4_cm7.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/adc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/crc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/cryp.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/dcmi.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/dma2d.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/eth.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/fmc.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/gpio.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/hash.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/i2c.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/main.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/resmgr_utility.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/rng.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/spi.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/stm32h7xx_hal_msp.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/stm32h7xx_it.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/syscalls.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/sysmem.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/tim.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Src/usart.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/Core/Startup/startup_stm32h757xihx.s.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/ThreadX/tx_initialize_low_level.S.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/ThreadX/stm32h7xx_hal_timebase_tim.c.obj h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/__/ext/soup/threadx/threadx/utility/execution_profile_kit/tx_execution_profile.c.obj -o h7-eval\CM4\h7-eval-m4.elf  ext/soup/hal/libstm32h7_hal.a  ext/soup/hal/libstm32h7_hal_resmgr.a  ext/soup/threadx/threadx/libthreadx.a  ext/soup/hal/libstm32h7_hal.a && cd ."
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:84: multiple definition of `__lock___sfp_recursive_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___sfp_recursive_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:87: multiple definition of `__lock___atexit_recursive_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___atexit_recursive_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:90: multiple definition of `__lock___at_quick_exit_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___at_quick_exit_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:93: multiple definition of `__lock___malloc_recursive_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___malloc_recursive_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:96: multiple definition of `__lock___env_recursive_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___env_recursive_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:99: multiple definition of `__lock___tz_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___tz_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:102: multiple definition of `__lock___dd_hash_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___dd_hash_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj:C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:105: multiple definition of `__lock___arc4random_mutex'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):(.bss.__lock___arc4random_mutex+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_init':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:114: multiple definition of `__retarget_lock_init'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_init+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_init_recursive':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:123: multiple definition of `__retarget_lock_init_recursive'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_init_recursive+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_close':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:146: multiple definition of `__retarget_lock_close'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_close+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_close_recursive':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:155: multiple definition of `__retarget_lock_close_recursive'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_close_recursive+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_acquire':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:164: multiple definition of `__retarget_lock_acquire'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_acquire+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_acquire_recursive':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:174: multiple definition of `__retarget_lock_acquire_recursive'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_acquire_recursive+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_try_acquire':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:185: multiple definition of `__retarget_lock_try_acquire'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_try_acquire+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_try_acquire_recursive':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:196: multiple definition of `__retarget_lock_try_acquire_recursive'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_try_acquire_recursive+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_release':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:206: multiple definition of `__retarget_lock_release'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_release+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: h7-eval/CM4/CMakeFiles/h7-eval-m4.dir/__/ThreadSafe/newlib_lock_glue.c.obj: in function `__retarget_lock_release_recursive':
C:/src/h7-eval/ThreadSafe/newlib_lock_glue.c:216: multiple definition of `__retarget_lock_release_recursive'; c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard\libc_nano.a(libc_a-lock.o):lock.c:(.text.__retarget_lock_release_recursive+0x0): first defined here
c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: h7-eval\CM4\h7-eval-m4.elf has a LOAD segment with RWX permissions
Memory region         Used Size  Region Size  %age Used
           FLASH:       53940 B         1 MB      5.14%
             RAM:          7 KB       288 KB      2.43%
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

This is due to the version of libc_nano included with the 12.2 release including the retargetable locking functions (the stubs?).  Is this a mistake?  They aren't weak so can't be overridden by the project to provide its own locking implementation.

libc_a-lock.o:
00000000 B __lock___arc4random_mutex
00000000 B __lock___atexit_recursive_mutex
00000000 B __lock___at_quick_exit_mutex
00000000 B __lock___dd_hash_mutex
00000000 B __lock___env_recursive_mutex
00000000 B __lock___malloc_recursive_mutex
00000000 B __lock___sfp_recursive_mutex
00000000 B __lock___tz_mutex
00000001 T __retarget_lock_acquire
00000001 T __retarget_lock_acquire_recursive
00000001 T __retarget_lock_close
00000001 T __retarget_lock_close_recursive
00000001 T __retarget_lock_init
00000001 T __retarget_lock_init_recursive
00000001 T __retarget_lock_release
00000001 T __retarget_lock_release_recursive
00000001 T __retarget_lock_try_acquire
00000001 T __retarget_lock_try_acquire_recursive

These symbols were not exported by the 11.2 build.  They conflict with the newlib_lock_glue.c generated by STM32CubeMX for STM32 projects (in this case, an H7 project).  I thought these retargetable locking functions were supposed to be implemented by the user, and that a default implementation was not possible for a bare metal application.  What is the intention for projects to do to work with GCC 12.2 newlib_nano?

Parents
  • I have double-checked this and I don't see any missing functions or lock structures:

    Newlib locking
    ==============
    
    In Cygwin lock.c:
    
    Variables (struct __lock)
            __lock___sfp_recursive_mutex
            __lock___atexit_recursive_mutex
            __lock___at_quick_exit_mutex
            __lock___malloc_recursive_mutex
            __lock___env_recursive_mutex
            __lock___tz_mutex
            __lock___dd_hash_mutex
            __lock___arc4random_mutex
    
    Functions
            __retarget_lock_init
            __retarget_lock_init_recursive
            __retarget_lock_close
            __retarget_lock_close_recursive
            __retarget_lock_acquire
            __retarget_lock_acquire_recursive
            __retarget_lock_try_acquire
            __retarget_lock_try_acquire_recursive
            __retarget_lock_release
            __retarget_lock_release_recursive
    
    GCC 12.2 newlib:
    
    $ nm c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a | grep __retarget | sort | uniq
             U __retarget_lock_acquire
             U __retarget_lock_acquire_recursive
             U __retarget_lock_close_recursive
             U __retarget_lock_init_recursive
             U __retarget_lock_release
             U __retarget_lock_release_recursive
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    
    $ nm c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a | grep __lock | sort | uniq
             U __lock___arc4random_mutex
             U __lock___at_quick_exit_mutex
             U __lock___atexit_recursive_mutex
             U __lock___env_recursive_mutex
             U __lock___malloc_recursive_mutex
             U __lock___sfp_recursive_mutex
             U __lock___tz_mutex
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    
    STM32 lock implementation:
    
    $ nm ThreadSafe/newlib_lock_glue.c.obj | grep __retarget | sort | uniq
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    
    $ nm ThreadSafe/newlib_lock_glue.c.obj | grep __lock | sort | uniq
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    

    I've checked the newlib lock.c source, the symbols in the C library (arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a) and in the STM32 generated code (newlib_lock_glue.c).  The functions and data symbols are identical in all of them.

    The symbols in libc_nano.a are not weak.  Will this result in a doubly-defined symbol error if every symbol within the object file is defined elsewhere?  Looking at the specific object file in the libc_nano.a archive:

    $ nm ./libc_a-lock.o
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    

    I don't see any additional public symbols which would be confounding things here.

    Unless I'm missing something very obvious, I can't see any cause for the linker error here, and this has left me somewhat confused.

    If you have any suggestions for what else might be at fault here, I would certainly be very grateful.

    Kind regards,

    Roger

Reply
  • I have double-checked this and I don't see any missing functions or lock structures:

    Newlib locking
    ==============
    
    In Cygwin lock.c:
    
    Variables (struct __lock)
            __lock___sfp_recursive_mutex
            __lock___atexit_recursive_mutex
            __lock___at_quick_exit_mutex
            __lock___malloc_recursive_mutex
            __lock___env_recursive_mutex
            __lock___tz_mutex
            __lock___dd_hash_mutex
            __lock___arc4random_mutex
    
    Functions
            __retarget_lock_init
            __retarget_lock_init_recursive
            __retarget_lock_close
            __retarget_lock_close_recursive
            __retarget_lock_acquire
            __retarget_lock_acquire_recursive
            __retarget_lock_try_acquire
            __retarget_lock_try_acquire_recursive
            __retarget_lock_release
            __retarget_lock_release_recursive
    
    GCC 12.2 newlib:
    
    $ nm c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a | grep __retarget | sort | uniq
             U __retarget_lock_acquire
             U __retarget_lock_acquire_recursive
             U __retarget_lock_close_recursive
             U __retarget_lock_init_recursive
             U __retarget_lock_release
             U __retarget_lock_release_recursive
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    
    $ nm c:/progra~2/armgnu~1/12dbab~1.2re/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a | grep __lock | sort | uniq
             U __lock___arc4random_mutex
             U __lock___at_quick_exit_mutex
             U __lock___atexit_recursive_mutex
             U __lock___env_recursive_mutex
             U __lock___malloc_recursive_mutex
             U __lock___sfp_recursive_mutex
             U __lock___tz_mutex
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    
    STM32 lock implementation:
    
    $ nm ThreadSafe/newlib_lock_glue.c.obj | grep __retarget | sort | uniq
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    
    $ nm ThreadSafe/newlib_lock_glue.c.obj | grep __lock | sort | uniq
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    

    I've checked the newlib lock.c source, the symbols in the C library (arm-none-eabi/12.2.1/thumb/v7e-m+dp/hard/libc_nano.a) and in the STM32 generated code (newlib_lock_glue.c).  The functions and data symbols are identical in all of them.

    The symbols in libc_nano.a are not weak.  Will this result in a doubly-defined symbol error if every symbol within the object file is defined elsewhere?  Looking at the specific object file in the libc_nano.a archive:

    $ nm ./libc_a-lock.o
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 b $d
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 t $t
    00000000 B __lock___arc4random_mutex
    00000000 B __lock___at_quick_exit_mutex
    00000000 B __lock___atexit_recursive_mutex
    00000000 B __lock___dd_hash_mutex
    00000000 B __lock___env_recursive_mutex
    00000000 B __lock___malloc_recursive_mutex
    00000000 B __lock___sfp_recursive_mutex
    00000000 B __lock___tz_mutex
    00000001 T __retarget_lock_acquire
    00000001 T __retarget_lock_acquire_recursive
    00000001 T __retarget_lock_close
    00000001 T __retarget_lock_close_recursive
    00000001 T __retarget_lock_init
    00000001 T __retarget_lock_init_recursive
    00000001 T __retarget_lock_release
    00000001 T __retarget_lock_release_recursive
    00000001 T __retarget_lock_try_acquire
    00000001 T __retarget_lock_try_acquire_recursive
    

    I don't see any additional public symbols which would be confounding things here.

    Unless I'm missing something very obvious, I can't see any cause for the linker error here, and this has left me somewhat confused.

    If you have any suggestions for what else might be at fault here, I would certainly be very grateful.

    Kind regards,

    Roger

Children
  • This turned out to be an odd issue with the linker.  I made this change:

    -        -Wl,--gc-sections -static -Wl,--start-group -lc -lm -Wl,--end-group
    +        -Wl,--gc-sections -static
    

    For some reason (I'll need to dig further), this was being placed on the linker command-line before the application object files and any linked libraries, and that was the cause of the linker error.  Removing it resolves this problem.

  • Ahhh nicely done! Yea I'd confirmed what you'd said about the symbols being identical, but never got around to experimenting with linker command line setups.

    It makes sense that this is the cause of the propblem we were seeing, though -- the {start/end}-group options would cause a loop where the linker would try to resolve all symbols it can from within the group, so that was pulling in the fault-stub library definitions before the overrides. Better practice would be to only do such grouping right at the end of the linker command line