我正在处理一个需要包装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/