gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:29:25 30 4
gpt4 key购买 nike

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

最佳答案

首先,请了解可执行文件不包含单个 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)

寻找LC_RPATH命令并记下 path 下的路径条目。

编辑:关于什么@loader_path是:它是引用想要加载框架的 Mach-O 对象的通用且动态的方式。

虽然这是一个相当人为的示例,但我认为它应该能够表达要点。假设我们有一个应用程序 MyApp.app使用框架MyFramework.framework 。我们还会说,为了正常运行,我要求我的应用程序安装在/Applications 中,而不是其他地方。因此,所述应用程序和框架的结构如下:

/Applications/MyApp.app/Contents/MacOS/MyApp (可执行) /Applications/MyApp.app/Contents/Frameworks/MyFramework.framework/MyFramework (Mach-O dylib)

如果我们运行 otool -L (注意大写的 L)在可执行文件上它将显示有关 MyFramework 的以下内容:

@rpath/MyFramework.framework/Versions/A/MyFramework
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
/usr/lib/libobjc.A.dylib
/usr/lib/libSystem.B.dylib
....

请注意,因为 MyFramework.framework 使用 @rpath安装名称/路径,我们需要有运行时搜索路径条目来替换 @rpath在运行时。现在,我可以有一个 rpath 条目:

/Applications/MyApp.app/Contents/Frameworks

这可行,并且在运行时这两个部分将组合在一起:

/Applications/MyApp.app/Contents/Frameworks + /MyFramework.framework/Versions/A/MyFramework ==

/Applications/MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/MyFramework

显然,对这样的路径进行硬编码并不理想,因为简单地将应用程序移动到其他文件夹或重命名应用程序本身就会导致链接失败。

@loader_path只是一种动态方式来引用应用程序的可执行文件,无论它存在于文件系统上的任何位置。在这种特殊情况下,在运行时它将填充正在运行的可执行文件的路径: /Applications/MyApp.app/Contents/MacOS/MyApp 。然后我们可以说,要找到 MyFramework.framework,您只需转到目录并转到 Frameworks .

关于macos - 在 macOS 上打印可执行文件的 rpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521802/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com