Ubuntu 22.04编译LLVM release/16.x遇llvm-tblgen执行格式错误
编译LLVM release/16.x分支时llvm-tblgen执行格式错误的问题与解决
问题背景
环境配置
- 运行环境:Oracle VirtualBox 7.0 中的 Ubuntu 22.04.2 LTS
- 硬件配置:5GiB内存、3核Intel(R) Core(TM) i7-8565U CPU
- 工具版本:Clang 14.0.0、CMake 3.22.1、Ninja 1.10.1、GNU gold 2.38、Python 3.10
CMake配置命令
mkdir -p build; mkdir -p installed; cd build; \ cmake -G "Ninja" \ -DCMAKE_C_COMPILER=$(which clang) \ -DCMAKE_CXX_COMPILER=$(which clang++) \ -DLLVM_ENABLE_PROJECTS="clang;lld" \ -DLLVM_TARGETS_TO_BUILD="X86;RISCV" \ -DCMAKE_BUILD_TYPE="Debug" \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DLLVM_PARALLEL_COMPILE_JOBS=2 \ -DCMAKE_INSTALL_PREFIX=$(pwd)/../installed \ -DLLVM_PARALLEL_LINK_JOBS=2 \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ -DBUILD_SHARED_LIBS=OFF \ -DLLVM_USE_SPLIT_DWARF=ON \ -DLLVM_USE_LINKER=gold \ -DLLVM_OPTIMIZED_TABLEGEN=ON \ -DCMAKE_EXE_LINKER_FLAGS='-Wl,-no-keep-memory,-fuse-ld=gold' \ ../llvm
编译错误信息
ninja -j2 all [243/3771] Building native llvm-tblgen... [236/236] Linking CXX executable bin/llvm-tblgen [326/3771] Building Attributes.inc... FAILED: include/llvm/IR/Attributes.inc /media/sf_shared_folder/myProject/llvm-project/build/include/llvm/IR/Attributes.inc cd /media/sf_shared_folder/myProject/llvm-project/build && /media/sf_shared_folder/myProject/llvm-project/build/NATIVE/bin/llvm-tblgen -gen-attrs -I /media/sf_shared_folder/myProject/llvm-project/llvm/include/llvm/IR -I/media/sf_shared_folder/myProject/llvm-project/build/include -I/media/sf_shared_folder/myProject/llvm-project/llvm/include /media/sf_shared_folder/myProject/llvm-project/llvm/include/llvm/IR/Attributes.td --write-if-changed -o include/llvm/IR/Attributes.inc -d include/llvm/IR/Attributes.inc.d /bin/sh: 1: /media/sf_shared_folder/myProject/llvm-project/build/NATIVE/bin/llvm-tblgen: Exec format error [327/3771] Building CXX object tools/clang/utils/TableGen/CMakeFiles/clang-tblgen.dir/ClangAttrEmitter.cpp.o ninja: build stopped: subcommand failed.
原因分析
- 共享文件系统干扰:编译目录位于VirtualBox共享文件夹(
/media/sf_shared_folder/),vboxsf文件系统不支持Linux二进制文件的完整权限和执行特性,导致生成的llvm-tblgen二进制损坏或无法识别。 - 编译/链接选项冲突:启用
LLVM_OPTIMIZED_TABLEGEN=ON并搭配GNU gold链接器的特殊参数,可能在生成原生工具时出现兼容性问题,导致二进制格式异常。 - 二进制架构不匹配:虽然是原生编译,但共享文件夹的文件系统特性可能导致二进制文件的架构标识被篡改,触发执行格式错误。
修复方案
迁移编译目录到本地磁盘
在Ubuntu虚拟机内部创建非共享目录(如~/myProject/llvm-project/),将代码克隆或移动到该目录后,重新执行CMake配置和编译命令,避开共享文件系统的限制。调整CMake编译选项
- 移除
-DLLVM_OPTIMIZED_TABLEGEN=ON选项,使用默认的非优化tablegen工具,降低编译异常概率。 - 将链接器从gold切换为bfd,修改CMake参数:
-DLLVM_USE_LINKER=bfd # 同时移除CMAKE_EXE_LINKER_FLAGS中的-fuse-ld=gold -DCMAKE_EXE_LINKER_FLAGS='-Wl,-no-keep-memory'
- 移除
彻底清理后重新构建
执行以下命令清空旧构建文件,确保新配置生效:cd build rm -rf * # 运行修改后的CMake命令 ninja -j2 all
内容的提问来源于stack exchange,提问作者anurag
相关产品推荐
相关产品推荐

