ld:找不到文件:/ Library /Developer /.../libclang_rt.ubsan_osx_dynamic.dylib

时间:2017-03-19 23:53:52

标签: xcode macos clang ubsan

我试图通过像这样构建

来使用Undefined Behavior Sanitizer
gcc -fsanitize=undefined add.c -o add

clang -fsanitize=undefined -O add.c -o add

在这两种情况下,我都找不到文件错误:

ld: file not found: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib

这是我在运行gcc -vclang -v

时获得的输出
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

根据this news release,它可以在GCC中使用,而original homepage则表示它已合并到LLVM中。链接到文章说GCC 4.9有它,我认为我有(至少 - 版本编号似乎不同但文章是几年前编写的,我已经多次更新我的系统。)

问题:如何构建可执行文件以使用UBSan?

2 个答案:

答案 0 :(得分:1)

为了使用未定义的行为清理程序,我必须使用clang以及libcxx和libcxxabi安装和构建LLVM,即使我的MacOS已经附带了一个版本的clang。 (结果我现在在计算机上安装了两个版本的clang)。来自llvm getting started page

cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

cd where-you-want-llvm-to-live
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang

cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi

现在,我可以通过运行

来使用未定义的行为清理程序
/usr/local/bin/clang -fsanitize=undefined -O add.c -o add

答案 1 :(得分:0)

根据博客Friday Q&A 2015-07-03: Address Sanitizer by Mike Ash

  
    

知道为什么Apple clang不支持-fsanitize=undefined

         

当我尝试时,我得到了:

clang -fsanitize=undefined ub.c
...
ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/
bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib
  
     

Spencer于2016-12-21 01:23:59:

     

如果使用-fsanitize=address,undefined则可行。希望这个   帮助找到此帖子的其他人像我一样搜索该错误。

它不是我们理想的解决方案,因为它们是独立的组件,我们对环境和工具的控制有限。我们不得不暂停一些Address Sanitizer测试,因为Asan使用GCC内联汇编和使用ebp / rbp作为通用寄存器产生不正确的结果。在这里,环境和工具由Travis CI提供。

Issue 33201, Apple Clang bundled with Xcode 8 does not reject -fsanitize=undefined when it should向LLVM提交了一份错误报告。它可能因为Apple Clang错误(我们没有iTunes帐户向Apple提交错误)而作为非主题关闭。