自制 llvm build 找不到 iOS 包含 _wordexp 符号的模拟器库
homebrew llvm build cannot find iOS simulator library containing _wordexp symbol
我正在研究 touching up homebrew's (OS X package manager) llvm formula。不幸的是,我添加的某些部分以我无法弄清楚的方式破坏了构建。
tl;dr ld
要求一个包含 iOS 模拟器的 _wordexp
符号的库,我完全不知道它在哪里,如果它存在的话
当编译器尝试 link iOS 模拟器的 address sanitizer dylib 时,我的编译始终失败。
复制步骤(OS 据我所知只有 X,手头没有 *nix 系统):
- 如果尚未安装 homebrew,请安装它
- 用上面的 WIP 替换自制软件的 llvm 公式
- 运行
brew install llvm --with-clang --with-lldb --verbose --debug
- 等待构建失败,问你怎么办
- 调试 shell
- cd 到
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
我认为这只是将另一个文件夹添加到 linker 搜索路径的问题。原来没那么简单:
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 个库导出了 _wordexp
(libsystem_asl
、libsystem_c
和libsystem_blocks
),但是当我将 /usr/lib/system
添加到搜索路径时 linker 似乎并不关心,即使代码是它想要的 x86_64 代码,并且我为其他平台找到的相应 dylib 不包含 _wordexp
- 谷歌搜索有关此特定符号丢失的信息主要是关于 Apple 使用 Perl
wordexp()
实现的内容
- 我想我记得在 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++
设置 sysroot 并没有为 ld
这样做
原来错误是自制软件处理编译器标志的方式造成的。这个问题和其他一些问题已经得到解决,所以这可能不再有用了。
对于那些好奇这到底是怎么坏的,自制软件试图改变编译器标志来抑制警告并创造更一致的构建体验。其中一项更改是删除任何 -isysroot
或 -system
标志,因为这是在稍后阶段由自制软件本身添加的。不幸的是,homebrew 假定只使用 OS X SDK,因此当构建预期使用 iPhone 模拟器 SDK 构建某些东西时,它被指向 OS X SDK。
我正在研究 touching up homebrew's (OS X package manager) llvm formula。不幸的是,我添加的某些部分以我无法弄清楚的方式破坏了构建。
tl;dr ld
要求一个包含 iOS 模拟器的 _wordexp
符号的库,我完全不知道它在哪里,如果它存在的话
当编译器尝试 link iOS 模拟器的 address sanitizer dylib 时,我的编译始终失败。
复制步骤(OS 据我所知只有 X,手头没有 *nix 系统):
- 如果尚未安装 homebrew,请安装它
- 用上面的 WIP 替换自制软件的 llvm 公式
- 运行
brew install llvm --with-clang --with-lldb --verbose --debug
- 等待构建失败,问你怎么办
- 调试 shell
- cd 到
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
我认为这只是将另一个文件夹添加到 linker 搜索路径的问题。原来没那么简单:
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 个库导出了_wordexp
(libsystem_asl
、libsystem_c
和libsystem_blocks
),但是当我将/usr/lib/system
添加到搜索路径时 linker 似乎并不关心,即使代码是它想要的 x86_64 代码,并且我为其他平台找到的相应 dylib 不包含_wordexp
- 谷歌搜索有关此特定符号丢失的信息主要是关于 Apple 使用 Perl
wordexp()
实现的内容 - 我想我记得在 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++
设置 sysroot 并没有为 ld
原来错误是自制软件处理编译器标志的方式造成的。这个问题和其他一些问题已经得到解决,所以这可能不再有用了。
对于那些好奇这到底是怎么坏的,自制软件试图改变编译器标志来抑制警告并创造更一致的构建体验。其中一项更改是删除任何 -isysroot
或 -system
标志,因为这是在稍后阶段由自制软件本身添加的。不幸的是,homebrew 假定只使用 OS X SDK,因此当构建预期使用 iPhone 模拟器 SDK 构建某些东西时,它被指向 OS X SDK。