在尝试使用Clang地址清理程序时获取未定义的符号:__ asan_memset

时间:2018-05-31 09:31:19

标签: c++ clang llvm clang++ address-sanitizer

我尝试使用带有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

我需要做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

您的主要可执行文件很可能未与-fsanitize=address链接。默认情况下,Clang将Asan运行时库(仅提供__asan_memset和其他Asan符号的定义)链接到可执行文件,而不是共享库,这会导致您的错误。

要解决此问题,您可以使用-fsanitize=address重新链接可执行文件,或使用-shared-libasan重新链接已清理的shlib并使用LD_PRELOAD=libclang_rt.asan.so运行。

有关详细信息,请参阅AsanDSO wikipage