【发布时间】: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