Отсутствует libclang rt.san-x86 64.файл для компилятора LLVM-rt
Я только что построил LLVM / Clang компилятор-rt и . Но, как ни странно, ссылка не удалась, так как она не может найти libclang_rt.san-x86_64.a
.
/usr/bin/ld: cannot find /home/hongxu/RESEARCH/llvm-git/obj/bin/../lib/clang/3.7.0/lib/linux/libclang_rt.san-x86_64.a: No such file or directory
clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)
когда я перешел в каталог /home/hongxu/RESEARCH/llvm-git/obj/bin/../lib/clang/3.7.0/lib/linux/
, я обнаружил, что есть другие файлы библиотеки
# AddressSanitizer
libclang_rt.asan_cxx-x86_64.a
libclang_rt.asan-preinit-x86_64.a
libclang_rt.asan-x86_64.a
# DataFlowSanitizer
libclang_rt.dfsan-libc-x86_64.a
libclang_rt.dfsan-x86_64.a
# LeakSanitizer
libclang_rt.lsan-x86_64.a
# MemorySanitizer
libclang_rt.msan-x86_64.a
# ThreadSanitizer
libclang_rt.tsan-x86_64.a
# UndefinedBehaviorSanitizer
libclang_rt.ubsan_cxx-x86_64.a
libclang_rt.ubsan_standalone_cxx-x86_64.a
libclang_rt.ubsan_standalone-x86_64.a
libclang_rt.ubsan-x86_64.a
и я могу угадать их функциональные возможности из имени в соответствии с страницей компилятора-rt.
но что такое libclang_rt.san-x86_64.a
? И как я могу его получить?
3 ответов
но, как ни странно, ссылка не удалась, так как она не может найти libclang_rt.san-x86_64.a.
да, make install
не устанавливает некоторые вещи, которые необходимы. В других случаях он устанавливает их в нестандартных местах.
другие вещи, которые он не устанавливает, включают asan_symbolize.py
, который используется для обозначения дампов из Address Sanitizer (ASan).
но что такое libclang_rt.san-x86_64.а? И как я могу получить это?
это одна из библиотек дезинфицирующих средств. У вас, вероятно, есть это, вы просто не понимаете, потому что это в нестандартном месте. Например, в моей системе (где я сам создаю LLVM / Clang):
$ find /usr -name libclang_rt.san-x86_64.a 2>/dev/null
/usr/local/lib/clang/3.5.0/lib/linux/libclang_rt.san-x86_64.a
Итак, что вам нужно сделать, это использовать LD_LIBRARY_PATH
(Linux) или DYLD_LIBRARY_PATH
(OS X), чтобы убедиться, что драйвер компилятора может найти его. Вы должны никогда необходимо вручную добавить различные библиотеки дезинфицирующих средств-драйвер компилятора должен всегда добавляйте их для себя.
для полноты, Clang 3.4 установил библиотеки дезинфицирующих средств на /usr/local/lib/clang/3.4/lib/linux/
в Linux; и Clang 3.3 установил их в /usr/local/lib/clang/3.3/lib/darwin/
на OS X.
вы можете фактически изменить каталоги поиска в исходном коде, и они будут автоматически подобраны драйвером компилятора. Я думаю, что мне пришлось изменить фактические источники, потому что я не мог найти опцию configure для добавления местоположений, таких как /usr/local/lib/clang/<version>/lib/linux/
. Взгляните на tools/clang/lib/Frontend/InitHeaderSearch.cpp
и друзей. Вот где пути, как .../include/c++/4.2.1
come from.
кстати, вот как использовать дезинфицирующее средство для адресов и asan_symbolize.py
. Во-первых, работать 2to3
и asan_symbolize.py
чтобы исправить то, что люди Python сломали, связанные с базовым вводом-выводом:
$ find Clang-3.5/ -name asan_symbolize.py
Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py
2to3 -w Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py
echo "" | Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py
# Fix errors 2to3 missed
затем скопируйте его в известное место (или поместите его на путь):
sudo cp Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py /usr/local/bin
тогда, для вашего проекта:
export CPPFLAGS="-fsanitze=undefined -fsanitize=address"
export CFLAGS="-fsanitze=undefined -fsanitize=address"
export CXXFLAGS="-fsanitze=undefined -fsanitize=address -fno-sanitize=vptr"
export CC=/usr/local/bin/clang
export CXX=/usr/local/bin/clang++
export LD_LIBRARY_PATH=/usr/local/lib/clang/3.5.0/lib/linux
./configure
make
make check 2>&1 | asan_symbolize.py
CPPFLAGS
на самом деле очень важно для проекта плагина. В противном случае, вы получите страшный C компилятор не может создавать исполняемые файлы ошибка.
когда у вас есть ошибка ASan, вы увидите похожие на:
make test 2>&1 | asan_symbolize.py
...
/usr/local/bin/clang -fsanitize=address -Xlinker -export-dynamic
-o python Modules/python.o libpython3.3m.a -ldl -lutil
/usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a -lm
./python -E -S -m sysconfig --generate-posix-vars
=================================================================
==24064==ERROR: AddressSanitizer: heap-buffer-overflow on address
0x619000004020 at pc 0x4ed4b2 bp 0x7fff80fff010 sp 0x7fff80fff008
READ of size 4 at 0x619000004020 thread T0
#0 0x4ed4b1 in PyObject_Free Python-3.3.5/./Objects/obmalloc.c:987
#1 0x7a2141 in code_dealloc Python-3.3.5/./Objects/codeobject.c:359
#2 0x620c00 in PyImport_ImportFrozenModuleObject
Python-3.3.5/./Python/import.c:1098
#3 0x620d5c in PyImport_ImportFrozenModule
Python-3.3.5/./Python/import.c:1114
#4 0x63fd07 in import_init Python-3.3.5/./Python/pythonrun.c:206
#5 0x63f636 in _Py_InitializeEx_Private
Python-3.3.5/./Python/pythonrun.c:369
#6 0x681d77 in Py_Main Python-3.3.5/./Modules/main.c:648
#7 0x4e6894 in main Python-3.3.5/././Modules/python.c:62
#8 0x2abf9a525eac in __libc_start_main
/home/aurel32/eglibc/eglibc-2.13/csu/libc-start.c:244
#9 0x4e664c in _start (Python-3.3.5/./python+0x4e664c)
AddressSanitizer can not describe address in more detail (wild
memory access suspected).
SUMMARY: AddressSanitizer: heap-buffer-overflow
Python-3.3.5/./Objects/obmalloc.c:987 PyObject_Free
Shadow bytes around the buggy address:
0x0c327fff87b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff87c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff87d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff87e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff87f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x0c327fff8800: fa fa fa fa[fa]fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff8810: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff8820: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff8830: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff8840: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c327fff8850: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Heap right redzone: fb
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack partial redzone: f4
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
ASan internal: fe
==24064==ABORTING
make: *** [pybuilddir.txt] Error 1
существует более полная запись процесса сборки LLVM/Clang и использование santizers в Python динамический анализ с Clang. Я написал его некоторое время назад, поэтому версия и рецепт устарели. Но концепции те же.
Спасибо за ответ @jww, но мой проблема другая.
У меня есть ответы из списка рассылки llvmdev (см. нить) и они сказали, что:
libclang_rt.Сан теперь ушел. Fresh compiler-RT build не содержит этой библиотеки, и fresh Clang не использует ее.
и мне не удалось скомпилировать, так как я не синхронизировал другие проекты llvm перед компиляцией (я только поместил компилятор-rt внутри llvm / projects каталог и сборка из корневого каталога llvm build).
и решение простое:
попытка построения с нуля (удалите каталог сборки, синхронизируйте все подпроекты llvm с той же редакцией, постройте снова).
библиотека по-прежнему используется с clang 3.7 (когда включены дезинфицирующие средства), но если она скомпилирована с использованием autotools, она будет отсутствовать. Я нашел этот поток, ища простое решение, но, похоже, его нет, кроме создания всего себя с помощью cmake.
см. Также LLVM выпуск 22757-libclang_rt.асан отсутствует в пакетах clang-3.8 deb.
другой вариант, который я использую, - использовать clang 3.6.