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

Jerome Forissier jerome.forissier at linaro.org
Wed May 28 17:37:31 CEST 2025



On 5/28/25 17:22, Raymond Mao wrote:
> Hi Jerome,
> 
> On Wed, 28 May 2025 at 04:25, Jerome Forissier
> <jerome.forissier at linaro.org> wrote:
>>
>> 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?
>>
> I am using this:
> CROSS_COMPILE=aarch64-none-linux-gnu- make O=out CC="clang -target
> aarch64-none-linux-gnu" all
> 
>>>
>>> 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?
>>
> I installed clang manually.
> 
> This is what I have:
> $ which clang
> /home/raymond/toolchain/clang-12.0.0/bin/clang
> $ clang --version
> clang version 12.0.0
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
> InstalledDir: /home/raymond/toolchain/clang-12.0.0/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
>     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)
>     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
> $ clang --print-resource-dir
> /home/raymond/toolchain/clang-12.0.0/lib/clang/12.0.0
> $ ls /home/raymond/toolchain/clang-12.0.0/lib/clang/12.0.0/lib/linux/libclang_rt.builtins*
> /home/raymond/toolchain/clang-12.0.0/lib/clang/12.0.0/lib/linux/libclang_rt.builtins-aarch64.a
>  /home/raymond/toolchain/clang-12.0.0/lib/clang/12.0.0/lib/linux/libclang_rt.builtins-x86_64.a
> /home/raymond/toolchain/clang-12.0.0/lib/clang/12.0.0/lib/linux/libclang_rt.builtins-armhf.a

Interesting. How did you install clang/LLVM? Did you get those builins
library from multiple release packages?

In the OP-TEE project we used to do that via a get_clang.sh script [1] but
it broke when llvm-project stopped releasing all the binary packages we needed
(aarch64-linux-gnu and armv7a-linux-gnueabihf). So we ended up importing the
__udivti3 implementation in source code instead [3]. I'm not saying this is
the way to go, but relying on libclang_rt.builtins assumes that a proper
toolchain is available, and that should at least be documented.

[1] https://github.com/OP-TEE/build/blob/1b68e0bb8a00/get_clang.sh
[2] https://github.com/OP-TEE/build/commit/8dd39dc99f09
[3] https://github.com/OP-TEE/optee_os/commit/48952fd403d8

Regards,
-- 
Jerome

> 
> Regards,
> Raymond
> 
>> Thanks,
>> --
>> Jerome
>>
>>>  endif
>>>  endif
>>> +undefine MK_ARCH
>>>  PLATFORM_LIBS += $(PLATFORM_LIBGCC)
>>>
>>>  ifdef CONFIG_CC_COVERAGE


More information about the U-Boot mailing list