gpt4 book ai didi

macos - 在使用 dlopen() 加载的 DLL 中覆盖 @executable_path

转载 作者:行者123 更新时间:2023-12-04 11:44:00 24 4
gpt4 key购买 nike

操作系统是 MacOS X,特别是 PowerPC G4 上的 10.5 (Leopard),但我在运行 10.6 的 x86 上遇到了同样的问题。

我正在编写一个动态加载 DLL 的应用程序。 DLL(我们称之为 foo.dylib)是另一个应用程序的一部分,位于硬盘的其他位置;我的应用程序发现 foo.dylib以编程方式(确切的位置可能会改变,可能用户通过 GUI 从正在运行的应用程序本身指定 DLL 路径)。例如,假设我的应用程序位于目录 /Application/MyApp.app/Contents/MacOS , 和 foo.dylib恰好在 /Application/OtherApp.app/Contents/MacOS . DLL 加载使用 dlopen() .

现在,事实证明 foo.dylib本身需要一堆其他DLL,它们在同一个目录中,但我事先对此一无所知。每个这样的额外 DLL 都在 foo.dylib 中注册。路径如 @executable_path/bar.dylib . @executable_path 的语义是它应该被找到当前进程可执行文件的目录替换。这对 OtherApp 非常有用,但对我不适用:当我打开 foo.dylib 时,它会尝试加载 bar.dylib , 它会在 /Application/MyApp.app/Contents/MacOS/bar.dylib 中查找它,这不是正确的目录。

一种解决方法是设置 DYLD_FALLBACK_LIBRARY_PATH环境变量为 /Application/OtherApp.app/Contents/MacOS ,但这必须在启动我的应用程序之前完成(动态链接器仅读取该环境变量一次;使用 setenv()putenv() 以编程方式更改其值无效)。这与 foo.dylib 位置的动态发现不兼容。文件。

是否有一种编程方式来覆盖 @executable_path 的效果? ?

最佳答案

从阅读 dyld source (搜索@executable_path),我会说答案是明确的“不”。 @executable_path 替换为主可执行文件路径,该路径作为全局字符串存储在 dyld 模块中。

是的,您的怀疑是正确的,dyld 在启动时读取并保存其环境变量,因此您无法动态更改它们(您可以搜索我为 DYLD_LIBRARY_PATH 链接的同一源文件)。您可以有一个 stub 应用程序来设置环境变量,然后启动您的真实应用程序。 dyld 在这里没有为您提供很多解决方案,它并不是真正旨在让您链接到任意私有(private)第三方库。

关于macos - 在使用 dlopen() 加载的 DLL 中覆盖 @executable_path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com