Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linker issue with Clang LLVM latest release #616

Open
navinreddy23 opened this issue Dec 24, 2024 · 1 comment
Open

Linker issue with Clang LLVM latest release #616

navinreddy23 opened this issue Dec 24, 2024 · 1 comment

Comments

@navinreddy23
Copy link

Hi,

I am trying to compile an existing project with Clang-LLVM instead of GCC. Compilation works fine, but fails at Linker.
The toolchain was downloaded from the releases on GitHub.

Compilation works fine, but I am unable to figure out why libclang_rt.builtins.a is required.

Linker error

clang: warning: argument unused during compilation: '--specs=picolib.specs' [-Wunused-command-line-argument]
ld.lld: error: cannot open /home/navin/Downloads/LLVM-ET-Arm-19.1.5-Linux-x86_64/lib/clang/19/lib/arm-unknown-none-eabi/libclang_rt.builtins.a: No such file or directory
clang: error: ld.lld command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Linker options

/home/navin/Downloads/LLVM-ET-Arm-19.1.5-Linux-x86_64/bin/clang --target=arm-none-eabi -mthumb -mcpu=cortex-m4 -march=armv7em -mfloat-abi=hard -mfpu=fpv4-sp-d16   -fdata-sections -ffunction-sections --sysroot=/opt/gcc-arm-none-v12/arm-none-eabi -isystem /opt/gcc-arm-none-v12/arm-none-eabi/arm-none-eabi/include -g --specs=picolib.specs -Wl,--gc-sections,-print-memory-usage    -T/home/navin/STM32CubeIDE/STM32WB5MMGHX_FLASH.ld -Wl,-Map=MY_APP.map BSP_Kite/Drivers/CMakeFiles/stm32wb5_bsp_hal.dir/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c.ob...

CMake toolchain file

# Define the CPU architecture for Threadx
set(THREADX_ARCH "cortex_m4")
set(THREADX_TOOLCHAIN "gnu")

set(MCPU_FLAGS "-mthumb -mcpu=cortex-m4 -march=armv7em")
set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16")

set(CLANG_COMPILER_PATH_PREFIX /home/navin/Downloads/LLVM-ET-Arm-19.1.5-Linux-x86_64/bin)

# Without that you will get linking error related to no _exit symbol when CMake tests gcc compile.
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

set(CMAKE_SYSTEM_NAME Generic)

set(CMAKE_C_COMPILER ${CLANG_COMPILER_PATH_PREFIX}/clang)
set(CMAKE_CXX_COMPILER ${CLANG_COMPILER_PATH_PREFIX}/clang++)
set(CMAKE_ASM_COMPILER ${CLANG_COMPILER_PATH_PREFIX}/clang)
set(CMAKE_LINKER ${CLANG_COMPILER_PATH_PREFIX}/ld.lld)

set(CMAKE_AR ${CLANG_COMPILER_PATH_PREFIX}/llvm-ar)
set(CMAKE_OBJCOPY ${CLANG_COMPILER_PATH_PREFIX}/llvm-objcopy)
set(CMAKE_OBJCOPY_BIN ${CLANG_COMPILER_PATH_PREFIX}/llvm-objcopy)
set(CMAKE_RANLIB ${CLANG_COMPILER_PATH_PREFIX}/llvm-ranlib)
set(CMAKE_STRIP ${CLANG_COMPILER_PATH_PREFIX}/llvm-strip)
set(CMAKE_SIZE_BIN ${CLANG_COMPILER_PATH_PREFIX}/llvm-size)
set(CMAKE_NM ${CLANG_COMPILER_PATH_PREFIX}/llvm-nm)
set(LLVM_CONFIG_PATH ${CLANG_COMPILER_PATH_PREFIX}/llvm-config)

set(COMPILER_RT_OS_DIR "baremetal")
set(COMPILER_RT_BUILD_BUILTINS ON)
set(COMPILER_RT_BUILD_SANITIZERS OFF)
set(COMPILER_RT_BUILD_XRAY OFF)
set(COMPILER_RT_BUILD_LIBFUZZER OFF)
set(COMPILER_RT_BUILD_PROFILE OFF)
set(COMPILER_RT_BAREMETAL_BUILD ON)
set(COMPILER_RT_DEFAULT_TARGET_ONLY ON)

set(BAREMETAL_ARMV7M_SYSROOT /opt/gcc-arm-none-v12/arm-none-eabi)

set(LLVM_BAREMETAL_ARM_TARGET_COMPILE_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${ASM_FLAGS_M4} ${CMAKE_COMMON_FLAGS}")

string(CONCAT basic_flags
        ${LLVM_BAREMETAL_ARM_TARGET_COMPILE_FLAGS}
        " -fdata-sections -ffunction-sections"
        # Those flags are needed to use newlib from the ARM GNU GCC toolchain
        " --sysroot=/opt/gcc-arm-none-v12/arm-none-eabi"
        " -isystem /opt/gcc-arm-none-v12/arm-none-eabi/arm-none-eabi/include"
)

set(CMAKE_C_FLAGS "${basic_flags}")
set(CMAKE_CXX_FLAGS "${basic_flags}")
set(CMAKE_ASM_FLAGS  "${basic_flags}")

set(CMAKE_C_COMPILER_TARGET arm-none-eabi)
set(CMAKE_CXX_COMPILER_TARGET arm-none-eabi)
set(CMAKE_ASM_COMPILER_TARGET arm-none-eabi)

set(CMAKE_ASM_FLAGS_MINSIZEREL "-Oz -DNDEBUG" CACHE STRING "")
set(CMAKE_C_FLAGS_MINSIZEREL "-Oz -DNDEBUG" CACHE STRING "")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Oz -DNDEBUG" CACHE STRING "")

set(CMAKE_EXE_LINKER_FLAGS "${LD_FLAGS}  --specs=picolib.specs -Wl,--gc-sections,-print-memory-usage")
@voltur01
Copy link
Contributor

voltur01 commented Jan 2, 2025

Hi,

It is not a supported use case to use LLVM Embedded Toolchain for Arm with Arm GNU Toolchain libraries directly as specified by --sysroot and -isystem above.

For better compatibility with existing GCC based projects, newlib package is provided, see https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/blob/main/docs/newlib.md and https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/blob/main/docs/migrating.md

Note that some level of build scripts migration is needed, e.g. to replace uses of --specs as suggested in the error message above as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants