# DYLD_FALLBACK_LIBRARY_PATH library variables can also break weak linking of libraries if 1) the weakly linked # library is not found, and 2) a fallback path contains an incompatible library. # # Assume a library weakly linked by a third-party library. If the library is not found, but a similarly named library # is found in DYLD_FALLBACK_LIBRARY_PATH, dyld will attempt to use that (incorrect) library. mkdir rust-lib mkdir third-party-lib # Create a 'libthird_party.dylib' library that weakly links to a 'libcommon_libname.dylib' echo 'void my_weak_api (void) { }' | clang -dynamiclib -x objective-c -o third-party-lib/libcommon_libname.dylib - echo 'extern void my_weak_api (void); void my_weak_api_caller (void) { if (my_weak_api) my_weak_api(); }' | clang -dynamiclib -x objective-c -o third-party-lib/libthird_party.dylib -weak_library third-party-lib/libcommon_libname.dylib - # Remove the weakly linked library; we're pretending that it's not available on this install, a possibility # that led us to weakly link it in the first place. rm third-party-lib/libcommon_libname.dylib # Create a conflictingly-named 'libcommon_libname.dylib' library clang -dynamiclib -x objective-c -o rust-lib/libcommon_libname.dylib - < /dev/null # Link our binary against libthird_party.dylib echo 'extern void my_weak_api_caller(void); int main (int argc, char *argv[]) { my_weak_api_caller(); return 0; }' | clang -x objective-c -o example - -Lthird-party-lib -lthird_party env DYLD_FALLBACK_LIBRARY_PATH=`pwd`/rust-lib ./example #dyld: lazy symbol binding failed: Symbol not found: _my_weak_api # Referenced from: third-party-lib/libthird_party.dylib # Expected in: /tmp/rust-lib/libcommon_libname.dylib #dyld: Symbol not found: _my_weak_api # Referenced from: third-party-lib/libthird_party.dylib # Expected in: /tmp/rust-lib/libcommon_libname.dylib