I'm working on touching up homebrew's (OS X package manager) llvm formula. Unfortunately, something about the parts I added broke the build in a way I just cannot figure out.
tl;dr ld
asks for a library containing a _wordexp
symbol for iOS simulator, and I have absolutely no clue where it is, if it exists
Compilation consistently fails for me when the compiler is attempting to link the address sanitizer dylib for iOS Simulator.
Reproduction steps (OS X only as far as I know, don't have *nix systems handy):
- install homebrew if it isn't already installed
- replace homebrew's llvm formula with the WIP one above
- Run
brew install llvm --with-clang --with-lldb --verbose --debug
- wait for the build to fail and ask you what to do
- Drop into a debug shell
- cd to
projects/compiler-rt/lib/asan/CMakeFiles/clang_rt.asan_iossim_dynamic.dir
add the following line to
link.txt
-Wl,-syslibroot /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
- go back up to
asan
- Run
make
At this point on my machine, something like this pops up:
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
I thought that it was just a matter of adding another folder to the linker search path. Turns out it isn't that simple:
wordexp.h
is in<path-to-iPhoneSimulator.sdk>/usr/include
, but runningfind . -type f -name "*.dylib" -print0 | xargs -0 nm | grep -n "T _wordexp" -B <large number> | less
in Xcode-beta.app showed that the only .dylibs in Xcode that exported a
_wordexp
symbol were in theWatchSimulator.platform
folder- Running the same command in
/usr
showed that 3 libraries in/usr/lib/system
exported_wordexp
(libsystem_asl
,libsystem_c
, andlibsystem_blocks
), but the linker doesn't seem to care when I add/usr/lib/system
to the search path even when the code is the x86_64 code it wants, and the corresponding dylibs I found for other platforms didn't contain_wordexp
- Googling about about this particular symbol missing turned up mostly stuff about Apple implementing
wordexp()
with Perl - I think I remember seeing something in the llvm-dev mailing list archives about *BSD/OSX not implementing
wordexp
, but the header file is definitely there,wordexp()
shows up in the manpages, and the functions declared in the header file seem to work just fine when compiling for OSX - The symbol is not in the libc++(abi) dylibs compiled earlier in the build
- Every other part of the build compiles just fine except for the
asan
folder and its parents
What am I missing? Given that this error does not seem to be particularly common, there could be a chance it's my machine, but I'm hoping the chances are pretty low, because I wiped and reinstalled my computer this weekend.
(OS X 10.11, Xcode/CLT 7.1, mid-2012 Retina pro)
If more info is needed I'll be happy to provide it.
Edit 1: Simplified link.txt
fix. Turns out setting sysroot for clang++
doesn't do so for ld