[PATCH] makefile: fix Clang link error when RSA_PUBLIC_KEY_PARSER is selected

Jerome Forissier jerome.forissier at linaro.org
Wed May 28 10:25:06 CEST 2025


Hi Rayond,

On 5/27/25 23:05, Raymond Mao wrote:
> MbedTLS bignum module needs '__udivti3' which is a 128-bit division
> function provided by the compiler runtime, typically libgcc for GCC or
> clang_rt.builtins for Clang.
> Thus 'clang_rt.builtins' library is required when building using Clang.

How do you reproduce the problem? Can you give the config and build
command you are using?

> 
> Fixes: 13de8483388c ("mbedtls: add mbedtls into the build system")
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
>  Makefile | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/Makefile b/Makefile
> index f88684947ee..16506dcaec6 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -37,7 +37,6 @@ else ifeq ("riscv32", $(MK_ARCH))
>  else ifeq ("riscv64", $(MK_ARCH))
>    export HOST_ARCH=$(HOST_ARCH_RISCV64)
>  endif
> -undefine MK_ARCH
>  
>  # Avoid funny character set dependencies
>  unexport LC_ALL
> @@ -915,8 +914,13 @@ PLATFORM_LIBGCC = arch/$(ARCH)/lib/lib.a
>  else
>  ifndef CONFIG_CC_IS_CLANG
>  PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) -print-libgcc-file-name`) -lgcc
> +else ifeq ($(CONFIG_RSA_PUBLIC_KEY_PARSER_MBEDTLS),y)
> +# mbedtls bignum needs '__udivti3' - a 128-bit division function that's provided by clang-rt.
> +CLANG_RT_DIR := $(shell $(CC) --print-resource-dir)/lib/linux
> +PLATFORM_LIBGCC := -L$(CLANG_RT_DIR) -lclang_rt.builtins-$(MK_ARCH)

I'm afraid this won't work when cross-compiling because the compiler-rt
builtins libraries are usually not installed with the compiler.
For example on my Ubuntu 24.04 machine:

$ clang --version
Ubuntu clang version 18.1.3 (1ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ clang --print-targets

  Registered Targets:
    aarch64     - AArch64 (little endian)
    aarch64_32  - AArch64 (little endian ILP32)
    aarch64_be  - AArch64 (big endian)
    amdgcn      - AMD GCN GPUs
    arm         - ARM
    arm64       - ARM64 (little endian)
    arm64_32    - ARM64 (little endian ILP32)
    armeb       - ARM (big endian)
    avr         - Atmel AVR Microcontroller
    bpf         - BPF (host endian)
    bpfeb       - BPF (big endian)
    bpfel       - BPF (little endian)
    hexagon     - Hexagon
    lanai       - Lanai
    loongarch32 - 32-bit LoongArch
    loongarch64 - 64-bit LoongArch
    m68k        - Motorola 68000 family
    mips        - MIPS (32-bit big endian)
    mips64      - MIPS (64-bit big endian)
    mips64el    - MIPS (64-bit little endian)
    mipsel      - MIPS (32-bit little endian)
    msp430      - MSP430 [experimental]
    nvptx       - NVIDIA PTX 32-bit
    nvptx64     - NVIDIA PTX 64-bit
    ppc32       - PowerPC 32
    ppc32le     - PowerPC 32 LE
    ppc64       - PowerPC 64
    ppc64le     - PowerPC 64 LE
    r600        - AMD GPUs HD2XXX-HD6XXX
    riscv32     - 32-bit RISC-V
    riscv64     - 64-bit RISC-V
    sparc       - Sparc
    sparcel     - Sparc LE
    sparcv9     - Sparc V9
    systemz     - SystemZ
    thumb       - Thumb
    thumbeb     - Thumb (big endian)
    ve          - VE
    wasm32      - WebAssembly 32-bit
    wasm64      - WebAssembly 64-bit
    x86         - 32-bit X86: Pentium-Pro and above
    x86-64      - 64-bit X86: EM64T and AMD64
    xcore       - XCore
    xtensa      - Xtensa 32
$ clang --print-resource-dir
/usr/lib/llvm-18/lib/clang/18
$ ls /usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.builtins*
/usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.builtins-i386.a  /usr/lib/llvm-18/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64.a


Are you doing cross compilation for arm or arm64? Did you have to
install the compiler-rt libraries separately from the compiler?

Thanks,
-- 
Jerome

>  endif
>  endif
> +undefine MK_ARCH
>  PLATFORM_LIBS += $(PLATFORM_LIBGCC)
>  
>  ifdef CONFIG_CC_COVERAGE


More information about the U-Boot mailing list