如何在Debian上用clang-22的-fsanitize=address避免链接错误?
问题:Debian Unstable/Experimental下clang-22搭配-fsanitize=address编译时链接错误
使用Debian Unstable/Experimental系统,用clang-22搭配-fsanitize=address编译代码时出现以下链接错误:
/usr/bin/ld: cannot find /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/libclang_rt.asan_static.a: No such file or directory /usr/bin/ld: cannot find /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/libclang_rt.asan.a: No such file or directory clang: error: linker command failed with exit code 1 (use -v to see invocation)
测试用C代码示例:
#include <stdio.h> #include <unistd.h> int main() { printf("Hello, world!\n"); *((volatile char*)NULL) = 3; return 0; }
使用以下命令编译时触发错误:
clang-22 -O3 -Og hello.c -fsanitize=address,undefined -o hello
改用gcc-15编译则正常。尝试用apt-file search /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/libclang_rt.asan.a查找提供该库的包,无结果。
解决方法
安装LLVM Runtime开发包
Debian中clang的sanitizer运行时库单独打包在对应版本的libllvm-<version>-rt-dev包中,执行以下命令安装:sudo apt update && sudo apt install libllvm-22-rt-dev安装完成后,clang所需的
libclang_rt.asan.a和libclang_rt.asan_static.a会被放置到正确路径。修复路径不匹配问题(如果安装后仍报错)
部分情况下,Debian会将库文件安装到/usr/lib/x86_64-linux-gnu/llvm-22/而非clang默认查找的路径,可以先确认库的实际位置:find /usr/lib -name "libclang_rt.asan*.a" | grep llvm-22如果路径与报错中的路径不一致,创建软链接修复:
sudo mkdir -p /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/ sudo ln -s /usr/lib/x86_64-linux-gnu/llvm-22/lib/clang/22/lib/linux/libclang_rt.asan.a /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/ sudo ln -s /usr/lib/x86_64-linux-gnu/llvm-22/lib/clang/22/lib/linux/libclang_rt.asan_static.a /usr/lib/llvm-22/lib/clang/22/lib/x86_64-pc-linux-gnu/临时使用动态链接版ASAN
如果不想处理静态库路径问题,可以编译时添加-shared-libasan参数,链接动态版本的AddressSanitizer库:clang-22 -O3 -Og hello.c -fsanitize=address,undefined -shared-libasan -o hello确保系统中已安装对应版本的动态asan库(如
libasan8),通常会随LLVM包自动安装。
内容的提问来源于stack exchange,提问作者horsey_guy
相关产品推荐
相关产品推荐

