C++ 缺少用于LLVM编译器rt的libclang_rt.san-x86_64.a文件

C++ 缺少用于LLVM编译器rt的libclang_rt.san-x86_64.a文件,c++,clang,llvm,C++,Clang,Llvm,我刚刚构建了LLVM/Clang,并尝试了-fsanize选项。但奇怪的是,链接失败了,因为它找不到libclang\u rt.san-x86\u 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 c

我刚刚构建了LLVM/Clang,并尝试了
-fsanize
选项。但奇怪的是,链接失败了,因为它找不到
libclang\u rt.san-x86\u 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\u rt.san-x86\u 64.a
?我怎样才能得到它

但奇怪的是,链接失败了,因为它找不到libclang_rt.san-x86_64.a

是的,
makeinstall
没有安装一些需要的东西。其他时候,它会将它们安装在非标准位置

它没有安装的其他东西包括
asan\u symbol.py
,它用于表示来自地址消毒器(asan)的转储


但是什么是libclang_rt.san-x86_64.a?我怎样才能得到它

它是消毒剂库之一。你可能有它,你只是没有意识到,因为它在一个非标准的位置。例如,在我的系统上(我自己构建LLVM/Clang):

$find/usr-name libclang\u rt.san-x86\u 64.a 2>/dev/null
/usr/local/lib/clang/3.5.0/lib/linux/libclang\u rt.san-x86\u 64.a
因此,您必须使用
LD\u LIBRARY\u PATH
(Linux)或
DYLD\u LIBRARY\u PATH
(OS X)来确保编译器驱动程序可以找到它。您应该永远不必手动添加各种消毒剂库-编译器驱动程序应该始终为您添加它们

为了完整起见,Clang 3.4在linux上的
/usr/local/lib/Clang/3.4/lib/linux/
上安装了消毒剂库;Clang3.3将它们安装在OSX上的
/usr/local/lib/Clang/3.3/lib/darwin/

实际上,您可以在源代码中更改搜索目录,编译器驱动程序将自动获取这些目录。我想我必须更改实际的源代码,因为我找不到一个配置选项来添加位置,比如
/usr/local/lib/clang//lib/linux/
。看看
tools/clang/lib/Frontend/InitHeaderSearch.cpp
和朋友们。这就是像
../include/c++/4.2.1
这样的路径的来源


顺便说一下,下面是如何使用地址消毒剂和
asan_symbol.py
。首先,运行
2to3
asan_symbol.py
修复Python人员破坏的与基本I/O相关的内容:

$find Clang-3.5/-name asan_symbol.py
Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbol.py
2to3-w Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbol.py
echo“| Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbol.py
#修正错误2to3遗漏
然后,将其复制到已知位置(或将其放置在路径上):

sudo cp Clang-3.5/llvm/projects/compiler-rt/lib/asan/scripts/asan_symbol.py/usr/local/bin
然后,对于您的项目:

export CPPFLAGS=“-fsanitze=undefined-fsanitize=address”
export CFLAGS=“-fsanitze=未定义-fsanitize=地址”
export cxflags=“-fsanitze=undefined-fsanitize=address-fno sanitize=vptr”
导出CC=/usr/local/bin/clang
导出CXX=/usr/local/bin/clang++
导出LD_LIBRARY_PATH=/usr/local/lib/clang/3.5.0/lib/linux
/配置
制作
勾选2>&1 | asan|u symbol.py
CPPFLAGS
实际上对于Autotools项目非常重要。否则,就会出现可怕的C编译器无法创建可执行文件错误

当您出现ASan错误时,您将看到类似于:

使测试2>和1|asan|u symbol.py
...
/usr/local/bin/clang-fsanitize=地址-Xlinker-导出动态
-o python模块/python.o libpython3.3m.a-ldl-lutil
/usr/local/ssl/lib/libssl.a/usr/local/ssl/lib/libcrypto.a-lm
./python-E-S-msysconfig——生成posix变量
=================================================================
==24064==错误:AddressSanitizer:地址上的堆缓冲区溢出
在pc机0x4ed4b2 bp 0x7fff80fff010 sp 0x7fff80fff008上安装0x619000004020
在0x619000004020螺纹T0处读取尺寸4
#PyObject_-Free Python-3.3.5//Objects/obmalloc.c:987中的0 0x4ed4b1
#代码_deallocpython-3.3.5//Objects/codeobject.c:359中的0x7a2141
#PyImport\u ImportFrozenModuleObject中的2 0x620c00
Python-3.3.5//Python/import.c:1098
#PyImport\u ImportFrozenModule中的3 0x620d5c
Python-3.3.5//Python/import.c:1114
#导入_init Python-3.3.5//Python/pythonrun.c:206中的4 0x63fd07
#5 0x63f636 in_Py_InitializeEx_Private
Python-3.3.5//Python/pythonnrun.c:369
#Py_Main Python-3.3.5//Modules/Main.c:648中的6 0x681d77
#主Python-3.3.5//Modules/Python.c:62中的7 0x4e6894
#8 0x2abf9a525eac位于主管道中
/home/aurel32/eglibc/eglibc-2.13/csu/libc start.c:244
#9 0x4e664c在_start(Python-3.3.5//Python+0x4e664c)中
AddressSanitizer无法更详细地描述地址(wild
内存访问可疑)。
摘要:AddressSanitizer:堆缓冲区溢出
Python-3.3.5//Objects/obmalloc.c:987 PyObject_Free
错误地址周围的阴影字节:
0x0c327fff87b0:fa fa
0x0c327fff87c0:fa fa
0x0c327fff87d0:fa fa
0x0c327fff87e0:fa fa
0x0c327fff87f0:fa fa
=>0x0c327fff8800:fa[fa]fa
0x0c327fff8810:fa fa
0x0c327fff8820:fa
0x0c327fff8830:fa
0x0c327fff8840:fa fa
0x0c327fff8850:fa fa
阴影字节图例(一个阴影字节代表8个应用程序字节):
地址:00
部分寻址