无法在 Mac OS El Capiton 上设置DYLD_INSERT_LIBRARIES环境变量



我正在处理一个需要包装libc调用的项目,特别是文件I/O调用,如打开,读取,写入,关闭等。我创建了一个共享库(例如,wrapper.so(并预加载了此 wrapper.so。 我可以通过设置 LD_PRELOAD 变量在 Linux 上成功使用此包装器。在MAC上,我尝试将DYLD_FORCE_FLAT_NAMESPACE设置为1,DYLD_INSERT_LIBRARIES设置为/path/wrapper.so,使用1(.bash_profile,2(launchctl setenv,3(LaunchAgent,4(LaunchDeamon方法,但没有任何效果。

我甚至尝试通过他们的 Info.plist 在应用程序级别为特定应用程序设置DYLD_FORCE_FLAT_NAMESPACE、DYLD_INSERT_LIBRARIES环境变量,但这也没有用。

注意:我可以使用上述所有方法设置一些随机的新变量,例如 MYVAR。因此,在设置 DYLD_* 变量时,我的设置遇到了问题。你能帮我在MAC上设置DYLD_FORCE_FLAT_NAMESPACE,DYLD_INSERT_LIBRARIES变量吗?

OS X 上的共享库 (.dylib( "知道"它希望安装到哪里,并且此信息反过来嵌入到任何链接到它的可执行文件中,以便可执行文件知道在运行时在哪里可以找到库。 虽然听起来很奇怪,但这就是它的工作原理。 苹果称其为dylib的"安装名称"。

您可以使用otool查看 dylib 的安装名称。例如:

$ otool -D wxwidgets.dylib
wxwidgets.dylib:
/Users/dipol/wxPython/dist-darwin/wx-2.8/wxWidgets/lib/wxwidgets.dylib

如果您的 dylib只有一个使用者,那么最简单的方法是告诉 dylib 使用相对路径而不是绝对路径作为其安装名称。 在构建库时,您可以像这样执行此操作:

gcc -o my_dylib.dylib -install_name @rpath/my_dylib.dylib ...

然后只需将 dylib 放在与可执行文件相同的目录中,它应该能够找到它。 这也适用于叮当声。 您还可以使用名为install_name_tool的实用程序设置 dylib 的安装名称,但这有点困难。

以下是一些您可能会觉得有用的链接:

苹果的文档

https://blogs.oracle.com/dipol/dynamic-libraries,-rpath,-and-mac-os http://log.zyxar.com/blog/2012/03/10/install-name-on-os-x/

最新更新