我刚刚构建了LLVM/Clang compiler-rt并尝试了-fsanitize
选项。但奇怪的是链接失败了,因为它找不到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
根据compiler-rt页面,我可以从名称中猜测它们的功能。
但是什么是libclang_rt.san-x86_64.a
?我怎样才能得到它?
4条答案
按热度按时间djp7away1#
但奇怪的是,链接失败了,因为它找不到libclang_rt.san-x86_64.a。
是的,
make install
不安装一些需要的东西。其他时候,它会将它们安装在非标准位置。它不安装的其他东西包括
asan_symbolize.py
,它用于从Address Sanitizer(ASan)中标记转储。但是什么是libclang_rt.san-x86_64.a?我怎么才能得到它?
它是一个消毒库。你可能有它,你只是没有意识到它,因为它在一个非标准的位置。例如,在我的系统上(我自己构建LLVM/Clang):
所以你需要做的是使用
LD_LIBRARY_PATH
(Linux)或DYLD_LIBRARY_PATH
(OS X)来确保编译器驱动程序可以找到它。你应该***永远***不得不手动添加各种消毒库-编译器驱动程序应该总是为你添加它们。为了完整起见,Clang 3.4在Linux上的
/usr/local/lib/clang/3.4/lib/linux/
上安装了消毒程序库;Clang 3.3在OS X上的/usr/local/lib/clang/3.3/lib/darwin/
安装了它们。你可以在源代码中改变搜索目录,它们会被编译器驱动程序自动拾取。我想我必须改变实际的源代码,因为我找不到一个配置选项来添加像
/usr/local/lib/clang/<version>/lib/linux/
这样的位置。看看tools/clang/lib/Frontend/InitHeaderSearch.cpp
和朋友。这就是像.../include/c++/4.2.1
这样的路径的来源。顺便说一下,这里是如何使用Address Sanitizer和
asan_symbolize.py
的。首先,运行2to3
和asan_symbolize.py
来修复Python人员在基本I/O方面的问题:然后,将其复制到一个众所周知的位置(或将其放在路径上):
然后,对于您的项目:
CPPFLAGS
实际上对于Autotools项目非常重要。否则,您会得到可怕的 *C编译器无法创建可执行文件 * 错误。当您遇到ASan错误时,您将看到类似以下内容:
这里有一篇关于LLVM/Clang构建过程和在Python的Dynamic Analysis with Clang上使用santizers的更完整的文章。我写了一段时间,所以版本和配方都过时了。但是概念是一样的。
nimxete22#
感谢@jww的回答;但我的问题不一样
我收到了来自llvmdev邮件列表的回复(参见the thread),他们说:
libclang_rt.san现在已经消失了。新的编译器-rt版本不包含这个库,并且新的Clang没有使用它。
而且我编译失败了,因为我在编译之前没有同步其他llvm项目(我只把compiler-rt放在llvm/projects目录下,并从llvm build根目录进行编译)。
解决办法很简单:
尝试从头开始构建(删除构建目录,将所有llvm子项目同步到同一修订版,然后再次构建)。
vddsk6oq3#
clang 3.7中仍然使用这个库(当启用消毒程序时),但如果使用autotools编译,它将丢失。我通过寻找一个简单的解决方案找到了这个线程,但似乎没有任何解决方案,除了使用cmake构建所有自己。
另请参见LLVM Issue 22757 - libclang_rt.asan missing in clang-3.8 deb packages。
另一个选项,我正在使用,是使用clang 3.6。
pdtvr36n4#
如果你从Linux发行版安装了clang,那么使用包管理器来搜索丢失的包。如果是Fedora和dnf,命令是
dnf whatprovides
:因此,
sudo dnf install -y compiler-rt
将为您安装此文件。