当尝试使用Clang地址监测工具时,出现未定义符号:__asan_memset问题

5
我正在尝试使用clang编译C ++应用程序并使用地址sanitizer,但是遇到以下错误:
/Class.so:未定义的符号:__asan_memset
我已将-fsanitize = address添加到编译器标志中
/opt/llvm-3.8.0/bin/clang++ -M --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=address
我已将-fsanitize = address和-lasan添加到链接器标志中:
-fsanitize=address -lasan -shared -fuse-ld=gold-2.25 -o Class.so Class.o
我还需要做什么才能使其正常工作?
1个回答

12
你的主要可执行文件可能没有链接 -fsanitize=address。默认情况下,Clang仅将Asan运行时库(提供 __asan_memset 和其他Asan符号的定义)链接到可执行文件中,而不是共享库,在这种情况下会导致错误。
要解决此问题,您可以重新链接可执行文件,使用 -fsanitize=address 或者重新链接带有 -shared-libasan 的已净化共享库,并使用 LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so) 运行(在其他发行版中,您可能需要使用 libclang_rt.asan.so)。
更多详细信息,请参见 AsanDSO wikipage

我需要在可执行文件链接器行中加入-lasan吗? - user997112
我有同样的问题,但不幸的是,我的主可执行文件被称为 /usr/bin/python,我无法重新链接它 :( (一个 Python 模块正在使用 ctypes.CDLL 加载经过消毒的 .so)。 - Bulletmagnet
对于我来说,我必须使用 clang -print-file-name=libclang_rt.asan.so(不包括 asan-x86_64)。我建议运行该命令。你应该会得到一个完整路径。如果没有,它就不能工作。 - Timmmm
RHEL 8。但我使用的是从LLVM网站下载的最新二进制Clang+LLVM。 - Timmmm
1
@Timmmm 看起来名称取决于发行版/工具链供应商。我已经更新了答案。 - yugr
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接