在macOS上打印可执行文件的rpath

sta*_*oat 68 macos terminal command-line darwin dynamic-linking

我想使用改变可执行文件的rpathinstall_name_tool,但我无法弄清楚rpath现在是什么.install_name_tool需要在命令行上给出旧的和新的rpath.我可以使用什么命令在macOS下打印可执行文件的rpath

NSG*_*God 88

首先,要了解可执行文件不包含单个rpath条目,而是包含一个或多个条目的数组.

其次,您可以使用otool列出图像的rpath条目.使用otool -l,您将获得如下输出,最后是rpath条目:

Load command 34
          cmd LC_LOAD_DYLIB
      cmdsize 88
         name /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)
   time stamp 2 Wed Dec 31 19:00:02 1969
      current version 1038.32.0
compatibility version 45.0.0

Load command 35
          cmd LC_RPATH
      cmdsize 40
         path @loader_path/../Frameworks (offset 12)
Run Code Online (Sandbox Code Playgroud)

查找LC_RPATH命令并记下path条目下的路径.

  • 什么是`@ loader_path`? (5认同)
  • @ nn0p我发现[本文](https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath)有助于理解loader_path。 (2认同)
  • 请注意,CMake 决定_永远_之前(从 3.0 开始!)默认切换到使用 `@rpath`,因为他们[考虑](https://cmake.org/cmake/help/latest/prop_tgt/ MACOSX_RPATH.html#prop_tgt:MACOSX_RPATH)“比‘@executable_path’和‘@loader_path’更灵活、更强大的替代方案”。基本逻辑是,所有库都被链接并标识为“@rpath/libname.dylib”——没有具体路径。除了极少数例外,只要您的可执行文件的安装位置具有“LC_RPATH”条目,就足够了。您不必摆弄安装后库更新。 (2认同)

pla*_*cel 13

您可以使用otool -l myexecutable,但是如果您只对rpath的列表感兴趣,这会打印出很多不必要的信息。

您可以通过以下方式过滤otool -l到相关rpath条目的输出

otool -l myexecutable | grep RPATH -A2
Run Code Online (Sandbox Code Playgroud)


Amo*_*hua 5

我发现我可以在 macOS 上使用打印共享库的安装名称

otool -D mylib
Run Code Online (Sandbox Code Playgroud)

此外,我可以通过将-id标志传递给 来直接设置安装名称,而无需参考旧的安装名称install_name_tool

install_name_tool -id @rpath/my/path mylib
Run Code Online (Sandbox Code Playgroud)