我正在开发一个项目,需要包装libc调用,特别是文件i / o调用,如open,read,write,close等。我创建了一个共享库(比如,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变量吗?
答案 0 :(得分:0)
OS X上的共享库(.dylib)知道'它希望安装到哪里,然后将这些信息嵌入到链接它的任何可执行文件中,以便可执行文件知道在运行时在哪里找到库。虽然听起来很奇怪,但它的工作方式却是如此。 Apple将其称为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放在与可执行文件相同的目录中,它应该能够找到它。这也适用于clang。您还可以使用名为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/