Mac OS X - 将可执行文件链接到不同的动态库,加载旧的和新的

时间:2014-02-11 08:14:41

标签: objective-c macos dyld otool install-name-tool

我有一个命令行工具,我用Xcode构建,链接到一些Apple框架。

作为一个“个人实验”(只是想了解动态库的工作原理)我尝试将可执行文件指向同一框架的不同版本。

比方说,可执行文件 EXEC 使用 LIB_A ,后者使用 LIB_B

我已经复制了 LIB_A LIB_B ,将它们放在不同的(较短的)目录路径下。

我使用otool -L来获取库的依赖关系和ID。

然后我使用install_name_tool指令-id来更改新 LIB_A LIB_B 的ID(基本上只是将前导路径更改为名称)没改变。)

然后使用指令-change我让新的 LIB_A 指向新的 LIB_B 并让可执行文件 EXEC 指向新的 LIB_A

这样,我想,应该已经正确地重新创建了整个依赖树。


install_name_tool未返回错误并检查可执行文件以及otool的新库,它们都指向正确的路径。

不幸的是,运行可执行文件 EXEC 会向控制台抛出许多关于类重复定义的错误。就像旧库和新库一样都加载了。

最后一切都因跟踪/ BPT陷阱:5

而崩溃

例如:

objc[25992]: Class NSAppleEventManager is implemented in both 
             /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and
             /xyz/Foundation.
             One of the two will be used. Which one is undefined.

如果我调用

export DYLD_PRINT_LIBRARIES=1

我在执行时看到实际上库被加载了两次。

1 个答案:

答案 0 :(得分:0)

我实际上是通过粗暴地设置

解决了这个问题
export DYLD_LIBRARY_PATH=

这适合我的特殊情况。