启用ASAN编译LLVM失败,求正确编译方案及报错解决
编译启用ASAN的LLVM正确方法
你的问题出在同时通过LLVM_ENABLE_PROJECTS和LLVM_USE_RUNTIMES引入compiler-rt,且用ASAN编译LLVM本体时触发了循环依赖——compiler-rt是ASAN的底层实现,当你要求用ASAN编译LLVM时,CMake会尝试用ASAN来构建compiler-rt,但compiler-rt的测试目标会引用还未生成的sanitizer公共目标,导致报错。
修正后的CMake命令(仅给LLVM二进制加ASAN)
如果你的目标只是让clang、lld等LLVM工具带上ASAN检测,不需要在本次编译中构建compiler-rt,用下面的命令:
cmake -G Ninja ../llvm \ -DCMAKE_INSTALL_PREFIX=/home/mikadore/local/llvm15-debug \ -DCMAKE_BUILD_TYPE=Debug \ -DLLVM_ENABLE_PROJECTS='lld;clang;clang-tools-extra' \ -DLLVM_ENABLE_LIBXML2=OFF \ -DLLVM_ENABLE_TERMINFO=OFF \ -DLLVM_ENABLE_LIBEDIT=OFF \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DLLVM_USE_SANITIZER='Address;Undefined' \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_C_COMPILER=clang
若需同时编译compiler-rt(分两步避免循环依赖)
这种情况必须拆分编译流程,先搭一套基础环境:
- 先编译不带ASAN的LLVM+compiler-rt,作为基础编译工具链:
cmake -G Ninja ../llvm \ -DCMAKE_INSTALL_PREFIX=/home/mikadore/local/llvm15-base \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS='lld;clang;clang-tools-extra;compiler-rt' \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DCMAKE_CXX_COMPILER=g++ \ -DCMAKE_C_COMPILER=gcc
- 用这套基础LLVM的clang,重新编译带ASAN的LLVM(可同时包含compiler-rt,此时compiler-rt会用基础clang编译,不会被ASAN插桩):
cmake -G Ninja ../llvm \ -DCMAKE_INSTALL_PREFIX=/home/mikadore/local/llvm15-debug \ -DCMAKE_BUILD_TYPE=Debug \ -DLLVM_ENABLE_PROJECTS='lld;clang;clang-tools-extra;compiler-rt' \ -DLLVM_ENABLE_LIBXML2=OFF \ -DLLVM_ENABLE_TERMINFO=OFF \ -DLLVM_ENABLE_LIBEDIT=OFF \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DLLVM_USE_SANITIZER='Address;Undefined' \ -DCMAKE_CXX_COMPILER=/home/mikadore/local/llvm15-base/bin/clang++ \ -DCMAKE_C_COMPILER=/home/mikadore/local/llvm15-base/bin/clang
关键说明
LLVM_USE_SANITIZER参数本身有效,但不能在构建compiler-rt的同时用它给LLVM本体加ASAN,会因依赖顺序冲突报错。- 不需要手动复制compiler-rt到llvm子目录,LLVM项目结构会自动识别llvm-project下的compiler-rt目录。
内容的提问来源于stack exchange,提问作者Mikdore
相关产品推荐
相关产品推荐

