【问题标题】:couldn't set DYLD_INSERT_LIBRARIES environment variable on Mac OS El Capiton [duplicate]无法在 Mac OS El Capiton 上设置 DYLD_INSERT_LIBRARIES 环境变量 [重复]
【发布时间】:2018-11-12 00:59:25
【问题描述】:

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

【问题讨论】:

  • 有趣的链接,谢谢@KenThomases。程序从哪里(哪个文件夹)启动?
  • 另外... Ken 的链接告诉您问题出在哪里,但不告诉您如何解决。我希望我的回答能做到这一点。
  • 嗯,它展示了解决方案的一般形式,即在启动受保护的二进制文件后设置环境变量。例如,如果您正在运行一个 shell 脚本,请让脚本自己设置它们,而不是试图让它从其父级继承它们。或者,如果可以的话,完全避免使用受保护的二进制文件。使用环境变量的另一种方法可能是dyld interposing

标签: macos environment-variables plist ld-preload launch-agent


【解决方案1】:

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 的安装名称,但这有点困难。

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

Apple's documentation

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

【讨论】:

  • 对不起,如果我错过了。这与设置 DYLD_* 环境变量有何关系
  • 它没有,直接。人们通常不会出于任何原因在 Mac 上这样做,正如我希望我的回答显示的那样,如果你按照我的建议去做,你也不应该这样做。正如 Ken 的链接所表明的那样,这种方法并不总是有效。
猜你喜欢
  • 2016-01-22
  • 2017-07-08
  • 2013-11-27
  • 2011-11-22
  • 2021-04-10
  • 2016-07-07
  • 2011-10-10
相关资源
最近更新 更多