使用Clang Address Sanitizer时遇__asan_memset未定义符号问题求助
__asan_memset 未定义符号问题 这个__asan_memset未定义的问题我之前排查过好几次,大概率是编译/链接阶段的ASan参数不统一,或者工具链配合出了问题。给你几个具体的排查和修复步骤:
确保编译和链接全程使用同一个Clang工具链
你现在的链接命令看起来是直接用链接器参数,但没有指定Clang作为链接驱动。如果默认用了系统GCC的链接器,很可能找不到Clang自带的ASan库。建议把链接命令改成用Clang来驱动,而且不需要显式加-lasan——因为-fsanitize=address会自动帮你链接ASan的库,显式添加反而可能引发版本冲突:/opt/llvm-3.8.0/bin/clang++ -fsanitize=address -shared -fuse-ld=gold-2.25 -o Class.so Class.o确认编译目标文件时也添加了ASan参数
你提供的编译命令用了-M(生成Makefile依赖的参数),但实际编译Class.o的时候,必须也要带上-fsanitize=address,否则目标文件里会引用ASan的符号,但没有和ASan的库关联。正确的编译命令应该是:/opt/llvm-3.8.0/bin/clang++ --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=address -c Class.cpp -o Class.o重点是
-c编译阶段就加上-fsanitize=address,保证生成的.o文件包含正确的ASan符号引用。检查库路径是否正确
偶尔会出现工具链找不到Clang自带ASan库的情况,可以在链接时显式指定Clang的库路径:/opt/llvm-3.8.0/bin/clang++ -fsanitize=address -L/opt/llvm-3.8.0/lib -shared -fuse-ld=gold-2.25 -o Class.so Class.o尝试禁用Gold链接器
旧版本的Gold链接器可能和Clang 3.8的ASan存在兼容性问题,你可以暂时去掉-fuse-ld=gold-2.25参数,用默认链接器试试,看是否能解决问题。排查干扰性参数
检查是否加了-nostdlib、-nodefaultlibs这类会跳过标准库链接的参数,或者过高的优化级别(比如-O2以上)——ASan在-O0/-O1下兼容性最好,高优化级别可能导致符号丢失。
内容的提问来源于stack exchange,提问作者user997112

