我尝试使用带有clang的地址清理程序来编译C ++应用程序,但收到以下错误:
/Class.so:未定义的符号:__ asan_memset
我已将-fsanitize = address添加到编译器标志
/opt/llvm-3.8.0/bin/clang++ -M --gcc-toolchain = / opt / gcc-5.2.0 -fsanitize =地址
我已将-fsanitize = address和-lasan添加到链接器标志:
-fsanitize = address -lasan -shared -fuse-ld = gold-2.25 -o Class.so Class.o
我需要做些什么才能让它发挥作用?
答案 0 :(得分:2)
您的主要可执行文件很可能未与-fsanitize=address
链接。默认情况下,Clang将Asan运行时库(仅提供__asan_memset
和其他Asan符号的定义)链接到可执行文件,而不是共享库,这会导致您的错误。
要解决此问题,您可以使用-fsanitize=address
重新链接可执行文件,或使用-shared-libasan
重新链接已清理的shlib并使用LD_PRELOAD=libclang_rt.asan.so
运行。
有关详细信息,请参阅AsanDSO wikipage。