如何在x86平台构建面向AArch64的LLVM/Clang交叉编译器?
x86平台构建LLVM/Clang AArch64交叉编译器完整步骤
编译器分为两类:
- 宿主编译器:可在x86、ARM、AArch64主机上编译同平台二进制文件
- 交叉编译器:可在x86主机上生成AArch64二进制文件
现有资料多聚焦宿主编译器构建,以下是x86平台构建AArch64交叉编译器的具体步骤,同时解决你遇到的链接报错问题。
一、准备工作
- 获取
llvm-project源码包并解压到本地目录 - (可选)若需要兼容GNU工具链,获取
binutils-gdb源码并解压,后续CMake配置时指定其头文件路径
二、CMake配置与编译
你的原有CMake命令未指定默认链接器,导致Clang调用系统x86的ld处理AArch64目标文件而报错。以下是修正后的配置命令:
cmake -G "Unix Makefiles" \ -DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_INSTALL_PREFIX="../dist" \ -DLLVM_TARGETS_TO_BUILD="AArch64;X86" \ -DLLVM_ENABLE_PROJECTS="clang;lld;llvm" \ -DLLVM_BUILD_TOOLS="ON" \ -DLLVM_BINUTILS_INCDIR="../../binutils-gdb/include" \ -DLLVM_INSTALL_BINUTILS_SYMLINKS="ON" \ -DLLVM_BUILD_LLVM_DYLIB="YES" \ -DLLVM_USE_LINKER=gold \ -DLLVM_INCLUDE_EXAMPLES=OFF \ -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ -DLLVM_APPEND_VC_REV=OFF \ -DLLVM_ENABLE_LIBPFM=OFF \ -DLLVM_ENABLE_DIA_SDK=OFF \ -DCLANG_DEFAULT_LINKER=lld \ -DCLANG_DEFAULT_TARGET_TRIPLE=aarch64-unknown-linux-gnu \ ../../llvm-project/llvm && make -j$(nproc)
关键参数说明:
LLVM_TARGETS_TO_BUILD="AArch64;X86":必须保留X86目标,确保生成的工具链可在x86主机上运行CLANG_DEFAULT_LINKER=lld:强制Clang默认使用LLVM自带的lld链接器,避免调用系统x86的ldCLANG_DEFAULT_TARGET_TRIPLE=aarch64-unknown-linux-gnu:设置默认目标架构,无需每次编译手动指定--target
三、安装工具链
编译完成后执行安装:
make install
四、验证工具链
- 直接编译测试C文件:
../dist/bin/clang -o main main.c
此时会自动使用lld链接AArch64目标文件,不会再出现架构不匹配的报错。
- 若未设置默认目标三元组,可手动指定:
../dist/bin/clang --target=aarch64-unknown-linux-gnu -fuse-ld=lld -o main main.c
五、解决链接入口符号缺失问题
你分开编译链接时出现的cannot find entry symbol _start,是因为未链接标准库。完整编译命令需添加标准库链接:
../dist/bin/clang --target=aarch64-unknown-linux-gnu -fuse-ld=lld -o main main.c -lc
若需要更完整的C标准库支持,可在CMake配置时添加compiler-rt;libcxx;libcxxabi到LLVM_ENABLE_PROJECTS,构建LLVM自带的标准库。
内容的提问来源于stack exchange,提问作者lol lol
相关产品推荐
相关产品推荐

