1

我正在开发一个需要包装 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 变量吗?

4

1 回答 1

1

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

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

$ 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 与您的可执行文件放在同一目录中,它应该能够找到它。这也适用于clang。您还可以使用名为 的实用程序设置 dylib 的安装名称install_name_tool,但这有点困难。

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

苹果的文档

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

于 2018-06-02T08:13:10.053 回答