我正在尝试将地址清理器与 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 维基页面。