获取未定义的符号:尝试使用Clang地址清理器时__asan_memset



我正在尝试将地址清理器与 clang 一起使用来编译C++应用程序,但收到以下错误:

/Class.so:未定义的符号:__asan_memset

我已经在编译器标志中添加了 -fsanitize=地址

/

opt/llvm-3.8.0/bin/clang++ -M --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=地址

我已经在链接器标志中添加了 -fsanitize=地址和 -lasan:

-

fsanitize=地址 -lasan -shared -fuse-ld=gold-2.25 -o Class.so 类.o

我还需要做什么才能让它工作?

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

要解决此问题,您可以将可执行文件与-fsanitize=address重新链接,或者将经过净化的shlibs与-shared-libasan重新链接并使用LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)运行(在其他发行版上,您可能需要使用libclang_rt.asan.so(。

有关更多详细信息,请参阅 AsanDSO 维基页面。

最新更新