Я пытаюсь скомпилировать расширение Python с помощью Address Sanitizer.Когда я загружаю расширение, я получаю
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
Таким образом, он не загружает символы из асана правильно.Я пытался использовать -static-libsan
, но результат был тот же.
Я видел, что некоторые люди используют LD_PRELOAD
для передачи Asan в общие объекты, однако, похоже, что libasan.so
в моей системе происходит из другой версии Address Sanitizer (устанавливается из пакета Debas libasan3, в то время как я получил clang от 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