When @rpath/libc++.dylib is missing, one of them can still be laoded via dlopen with RTLD_NOW, and I want to understand why.
Additional infomation:
- Both dylibs are the same architecture(arm64)
- They had identical LC_RPATH settings. But I've removed them via install_name_tool just to simplify the problem.
- Through otool -l to view load commands, I can't find any differnent between them except they had different libSystem.B.dylib version.
And then,I through setting DYLD_PRINT_SEARCHING=1 and load them. I found differenes in their dependency search processes, but' I'm unsure what causes this discrepancy.
these are outputs:
./a.out libchrome_zlib.dylib.good
dyld[37001]: find path "/usr/lib/libc++.1.dylib"
dyld[37001]: possible path(original path on disk): "/usr/lib/libc++.1.dylib"
dyld[37001]: possible path(cryptex prefix): "/System/Volumes/Preboot/Cryptexes/OS/usr/lib/libc++.1.dylib"
dyld[37001]: possible path(original path): "/usr/lib/libc++.1.dylib"
dyld[37001]: found: dylib-from-cache: (0x000A) "/usr/lib/libc++.1.dylib"
dyld[37001]: find path "/usr/lib/libSystem.B.dylib"
dyld[37001]: possible path(original path on disk): "/usr/lib/libSystem.B.dylib"
dyld[37001]: possible path(cryptex prefix): "/System/Volumes/Preboot/Cryptexes/OS/usr/lib/libSystem.B.dylib"
dyld[37001]: possible path(original path): "/usr/lib/libSystem.B.dylib"
dyld[37001]: found: dylib-from-cache: (0x00AB) "/usr/lib/libSystem.B.dylib"
dyld[37001]: find path "libchrome_zlib.dylib.good"
dyld[37001]: possible path(original path on disk): "libchrome_zlib.dylib.good"
dyld[37001]: found: dylib-from-disk: "libchrome_zlib.dylib.good"
dyld[37001]: find path "@rpath/libc++.dylib"
dyld[37001]: possible path(default fallback): "/usr/local/lib/libc++.dylib"
dyld[37001]: possible path(default fallback): "/usr/lib/libc++.dylib"
dyld[37001]: found: dylib-from-cache: (0x000A) "/usr/lib/libc++.dylib"
./a.out libchrome_zlib.dylib.bad
dyld[41256]: find path "/usr/lib/libc++.1.dylib"
dyld[41256]: possible path(original path on disk): "/usr/lib/libc++.1.dylib"
dyld[41256]: possible path(cryptex prefix): "/System/Volumes/Preboot/Cryptexes/OS/usr/lib/libc++.1.dylib"
dyld[41256]: possible path(original path): "/usr/lib/libc++.1.dylib"
dyld[41256]: found: dylib-from-cache: (0x000A) "/usr/lib/libc++.1.dylib"
dyld[41256]: find path "/usr/lib/libSystem.B.dylib"
dyld[41256]: possible path(original path on disk): "/usr/lib/libSystem.B.dylib"
dyld[41256]: possible path(cryptex prefix): "/System/Volumes/Preboot/Cryptexes/OS/usr/lib/libSystem.B.dylib"
dyld[41256]: possible path(original path): "/usr/lib/libSystem.B.dylib"
dyld[41256]: found: dylib-from-cache: (0x00AB) "/usr/lib/libSystem.B.dylib"
dyld[41256]: find path "libchrome_zlib.dylib.bad"
dyld[41256]: possible path(original path on disk): "libchrome_zlib.dylib.bad"
dyld[41256]: found: dylib-from-disk: "libchrome_zlib.dylib.bad"
dyld[41256]: find path "@rpath/libc++.dylib"
dyld[41256]: not found: "@rpath/libc++.dylib"
dlopen failed: dlopen(libchrome_zlib.dylib.bad, 0x0002): Library not loaded: @rpath/libc++.dylib
Referenced from: <42E93041-7B58-365B-9967-04AE754AA9F0> /Users/jiangzh/dlopen/libchrome_zlib.dylib.bad
Reason: no LC_RPATH's found