7

Short question: Are the rpaths from a LC_RPATH command inside a library passed onto subsequent (and indirect) dynamically loaded libraries?

To be more precise: I have libapi.dylib dynamically linked to libloader.dylib which in turn dynamically loads a plugin libplugin.dylib. I've got:

$ otool -l lib/libapi.dylib
lib/libapi.dylib
        libapi.dylib
        /usr/lib/libSystem.B.dylib
        @rpath/libloader.dylib

$ otool -l lib/libloader.dylib
lib/libloader.dylib
        libloader.dylib
        /usr/lib/libSystem.B.dylib

$ otool -l lib/plugins/libplugin.dylib
lib/plugins/libplugin.dylib:
        libplugin.dylib
        /usr/lib/libSystem.B.dylib
        @rpath/libloader.dylib

$ otool -L lib/libapi.dylib | grep "LC_RPATH" -A2
        cmd LC_RPATH
      cmdsize 32
        path @loader_path/ (offset 12)

Neither libloader.dylib nor libplugin.dylib define a rpath command. And the install names are without any @rpath/ or other paths, although the names in the load commands are prepended by a @rpath/.

The client now loads libapi.dylib which in turn is linked to libloader.dylib. This library dynamically now loads libplugin.dylib which is linked to libloader.dylib.

Why can't libplugin.dylib by loaded? It quits since it can't find libloader.dylib - although it must be already loaded. Why is the rpath @loader_path/ from libapi.dylib not properly propagated over libloader.dylib to libplugin.dylib? Using the DYLD_PRINT_RPATHS environment variable, I can see, that no rpath substitution is tried in order to load libloader.dylib in libplugin.dylib. What the heck going on here?

0xced
  • 25,219
  • 10
  • 103
  • 255
phlipsy
  • 2,899
  • 1
  • 21
  • 37

0 Answers0