2011-11-18 33 views
10

在Mac OS X上,DYLD格式的二进制可执行文件包含“加载器命令”,用于指示库加载系统如何处理文件内容。尤其是,加载器命令指示系统应从哪里搜索依赖库等。如何安装ld没有明确支持的DYLD加载器命令?

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

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

我的问题是,我需要做什么来为不支持(显然)由ld支持的公共类型加载器命令?

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

我没有看到任何有利于此的ld参数。像“-sectcreate”这样的东西,但专门添加到加载器命令的内容,就是我所追求的。

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

回答

14

它看起来像你可以使用-dyld_env,就像这样:“-dyld_env DYLD_FRAMEWORK_PATH = /”。这在手册页中没有记录,但可以在ld64的Options.cpp中找到,并在更新日志文件中提到。如果你想从Xcode中完成,你可能需要这样做:“-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /”。

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

+0

太棒了!谢谢。我还通过Twitter得到了一些反馈,注意指出LC_DYLD_ENVIRONMENT实际上并没有让你定义任意的环境变量,只有那些影响DYLD加载的环境变量。因此,在下面的内容中,来自Ned的LS环境建议更适合我的直接需求,但您的回答是问题要点的最合适的参考。 – danielpunkass

8

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

+0

谢谢,内德!这不是对所提问题的典型回答,但的确是它成为我目前对DYLD加载器命令功能感兴趣的核心。我将使用LSEnvironment用于描述的目的! – danielpunkass