homebrew llvm build找不到包含_wordexp符号的

时间:2015-09-15 21:13:18

标签: xcode macos linker cmake llvm

我正在研究touching up自制软件(OS X软件包管理器)llvm formula。不幸的是,关于我添加的部分的某些内容以一种我无法弄清楚的方式打破了构建。

tl; dr ld要求为iOS模拟器提供包含_wordexp符号的库,我绝对不知道它在哪里,如果它存在

当编译器尝试链接iOS模拟器的address sanitizer dylib时,编译始终失败。

复制步骤(据我所知,OS X没有* nix系统方便):

  • 安装自制软件(如果尚未安装)
  • 将homebrew的llvm公式替换为上面的WIP
  • 运行brew install llvm --with-clang --with-lldb --verbose --debug
  • 等待构建失败并询问您要做什么
  • 放入调试shell
  • cd to projects/compiler-rt/lib/asan/CMakeFiles/clang_rt.asan_iossim_dynamic.dir
  • 将以下行添加到link.txt

    -Wl,-syslibroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
    
  • 返回asan
  • 运行make

在我的机器上的这一点,弹出这样的东西:

Undefined symbols for architecture x86_64:
  "_wordexp", referenced from:
      _wrap_wordexp in asan_interceptors.cc.o
      substitution_wordexp in asan_interceptors.cc.o
     (maybe you meant: _wrap_wordexp)
ld: symbol(s) not found for architecture x86_64

我认为只需在链接器搜索路径中添加另一个文件夹即可。事实证明并非如此简单:

  • wordexp.h位于<path-to-iPhoneSimulator.sdk>/usr/include,但正在运行

    find . -type f -name "*.dylib" -print0 | xargs -0 nm | grep -n "T _wordexp" -B <large number> | less
    
    Xcode-beta.app中的

    显示Xcode中唯一导出_wordexp符号的.dylib位于WatchSimulator.platform文件夹

  • /usr中运行相同的命令,显示/usr/lib/system中的3个库导出_wordexplibsystem_asllibsystem_clibsystem_blocks),但是当我将/usr/lib/system添加到搜索路径时链接器似乎并不关心,即使代码是它想要的x86_64代码,我找到的其他平台的相应dylib也不包含_wordexp
  • 谷歌搜索关于这个特殊符号缺失的信息大多出现在Apple实施wordexp() Perl
  • 的内容中
  • 我想我记得在llvm-dev邮件列表中看到有关* BSD / OSX没有实现wordexp的内容,但是头文件肯定存在,wordexp()显示在联机帮助页中,并且在编译OSX时,头文件中声明的函数似乎工作正常
  • 该符号不在之前在构建
  • 中编译的libc ++(abi)dylib中
  • 除了asan文件夹及其父文件
  • 之外,构建的每个其他部分都编译得很好

我错过了什么?鉴于这个错误似乎不是特别常见,可能是我的机器,但我希望机会很低,因为我本周末擦了并重新安装了我的电脑。

(OS X 10.11,Xcode / CLT 7.1,2012年中期Retina pro)

如果需要更多信息,我很乐意提供。

修改1:简化link.txt修正。原来clang++ ld的设置sysroot没有为/tmp/r

设置

1 个答案:

答案 0 :(得分:0)

原来错误是自制软件处理编译器标志的结果。那以及其他一些问题已经解决,所以这可能不再有用了。

对于那些对此如何破坏感到好奇的人,自制软件尝试更改编译器标志以抑制警告并创建更一致的构建体验。其中一项更改是删除任何-isysroot-system标志,因为这是由自制软件本身在稍后阶段添加的。不幸的是,自制软件假设只使用OS X SDK,因此当构建期望使用iPhone模拟器SDK构建内容时,它指向OS X SDK。