【发布时间】:2014-02-11 08:14:40
【问题描述】:
我有一个使用 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时,控制台会抛出许多关于类的重复定义的错误。就像旧库和新库都被加载一样。
最后一切都因 Trace/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
我在执行时看到库实际上被加载了两次。
【问题讨论】:
标签: objective-c macos dyld otool install-name-tool