我有一个用 Xcode 构建的命令行工具,它链接到一些 Apple 框架。
作为“个人实验”(只是想了解一点动态库的工作原理),我试图将可执行文件指向相同框架的不同版本。
例如,假设可执行EXEC使用LIB_A,后者使用LIB_B。
我制作了LIB_A和LIB_B的副本,将它们放在不同的(较短的)目录路径下。
我曾经otool -L
获取依赖项和库的 ID。
然后我使用install_name_tool
with 指令-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
我在执行时看到实际上库被加载了两次。