Отсутствует 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.