Адрес Sanitizer на расширение Python - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь скомпилировать расширение 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

1 Ответ

1 голос
/ 15 апреля 2019

Чтобы очистить одну библиотеку (без очистки основного python исполняемого файла) с помощью Clang, вам необходимо

  • добавить -shared-libasan в LDFLAGS (Clang по умолчанию -static-libasan, в отличие от GCC)
  • работает с LD_PRELOAD=path/to/libclang_rt.asan-x86_64.so (должно быть где-то со стандартными библиотеками Clang)

(см. AddressSanitizerAsDso wiki ).

Другой вариант -использование GCC, в этом случае -shared-libasan не требуется, а значение LD_PRELOAD становится libasan.so.N (N зависит от версии GCC).

Для получения дополнительной информации о различиях между GCC и Clang в отношении очистки этот ответ .

...