【问题标题】:Address Sanitizer on a python extensionpython 扩展上的地址消毒剂
【发布时间】:2019-09-05 14:57:09
【问题描述】:

我正在尝试使用 Address Sanitizer 编译 python 扩展。当我加载扩展时,我得到了

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    from extension import package
  File "/tmp/python_test/extension/package.py", line 28, in <module>
    from extension._ext import *
ImportError: /tmp/python_test/extension/_ext.so: undefined symbol: __asan_version_mismatch_check_v8

编译器调用是

clang -g -o _ext.so code.ll -fsanitize=address -lrt -lpthread -ldl -lstdc++ -lm -fPIC -shared

因此,它不能正确地从 asan 加载符号。我试过使用-static-libsan,但结果是一样的。

我看到有些人使用LD_PRELOAD 来让 Asan 进入共享对象,但是,我系统上的 libasan.so 似乎来自不同版本的 Address Sanitizer(从 Debian 的 libasan3 包安装,而我来自 deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch-8 main) 的叮当声。

那么,如何使 Address Sanitizer 与共享对象库一起使用? 要么,我需要正确版本的libasan.so(它似乎不在deb http://apt.llvm.org/stretch/llvm-toolchain-stretch-8 main 中,或者我需要一种静态链接的方法)。

我的 clang 版本:

$ clang -v
clang version 8.0.0-svn356034-1~exp1~20190313094216.53 (branches/release_80)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.3.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

【问题讨论】:

    标签: python clang address-sanitizer


    【解决方案1】:

    要使用 Clang 清理单个库(不清理主 python 可执行文件),您应该

    • -shared-libasan 添加到LDFLAGS(Clang 默认为-static-libasan,与 GCC 不同)
    • 使用 LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so) 运行(它应该在标准 Clang 库的某个地方)

    (见AddressSanitizerAsDso wiki)。

    另一种选择是使用 GCC,在这种情况下,-shared-libasan 不需要,LD_PRELOAD 值变为 libasan.so.NN 取决于 GCC 版本,使用 $(gcc -print-file-name=libasan.so) 来定位它)。

    有关 GCC 和 Clang 在清理 shlib 方面的差异的更多详细信息,请参阅this answer

    【讨论】:

    • 它有效。正确的文件名是/usr/lib/llvm-8/lib/clang/8.0.0/lib/linux/libclang_rt.asan-x86_64.so。
    • @Alex 检查我的更新,我们可以自动识别库位置。
    • 对于 Mac 用户:使用 DYLD_INSERT_LIBRARIES 而不是 LD_PRELOAD
    • @StuartBerg 谢谢!你介意添加这个来回答吗?
    猜你喜欢
    • 2021-03-06
    • 2016-07-28
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-03-07
    • 2021-02-08
    相关资源
    最近更新 更多