11

在 Mac OS X 上,DYLD 格式的二进制可执行文件包含指示库加载系统如何处理文件内容的“加载器命令”。特别是,loader 命令指示系统应该在哪里搜索依赖库等。

您可以通过运行“otool -l /path/to/your/app”查看系统上任何二进制文件的加载程序命令的完整列表。

一般来说,这些加载器命令是由“ld”工具在项目编译的链接阶段设置的。

我的问题是,我需要怎么做才能为 ld(显然)不支持的公开类型添加加载器命令?

特别是,我想利用 LC_DYLD_ENVIRONMENT 加载程序命令,它可用于在二进制文件的加载程序命令表中指定一个字符串,该字符串应作为可执行文件上下文中的环境变量设置进行加载和评估。

我没有看到任何对 ld 有帮助的论点。像“-sectcreate”这样的东西,但专门添加到加载器命令的内容,是我所追求的。

我知道这是可能的,因为 Mac OS X 上至少有一个标准应用程序使用它:Safari。但是我不知道他们是否通过对二进制文件进行某种链接后按摩来实现这一点,如果他们使用知道如何构建和链接自定义加载程序命令的自定义版本的 ld,或者他们是否正在利用我无法弄清楚的 ld 命令的通用功能。

4

2 回答 2

15

看起来您可以使用 -dyld_env,如下所示:“-dyld_env DYLD_FRAMEWORK_PATH=/”。这在手册页中没有记录,但可以在 ld64 的 Options.cpp 中找到,并在 Changelog 文件中提到。如果您尝试从 Xcode 执行此操作,您可能必须这样做:“-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH=/”。

需要注意的一点:如果您查看 dyld 的 dyld.cpp,您会发现它只允许以 DYLD_ 开头并以 _PATH 结尾的环境变量。

于 2011-11-18T20:56:12.483 回答
8

如果您的可执行文件是作为标准 OS X 应用程序包的一部分(即可以由用户启动的 .app)的一部分,则指定应用程序特定环境变量的常规方法是使用LSEnvironment密钥通过其 plist 文件。请参阅此处了解更多信息。

于 2011-11-18T20:42:30.070 回答