[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