pee*_*onn 6 macos plugins dylib dynamic-linking
我有两个插件pluginA.plugin,pluginB.plugin它们都依赖于同一个库libC.dylib。构建插件时,我递归地遍历动态依赖关系(使用otool -L),将每个依赖关系复制到每个插件libs文件夹内,并使用来调整依赖关系路径install_name_tool,即“随身携带我所有的东西”方法。
我试图了解当某些程序将加载这两个插件时发生了什么?将libC.dylib被加载两次,这将导致运行时崩溃?还是运行时会意识到同一dylib有两个副本(基于版本?)而仅使用一个?
动态库搜索和加载的顺序在Apple的动态库使用指南中描述
简而言之,如果插件中依赖库的路径匹配,则该库将仅加载一次。在每次下一次加载时,只会增加内部计数器:
dlopen 函数返回与第一次调用时返回的库句柄相同的库句柄,但它还会增加与该句柄关联的引用计数
如果库的路径不同,则将加载库的不同副本。
注意:在检查库是否已加载时,使用它的绝对路径。它可以直接设置依赖关系,在全局目录中搜索期间发现或从@rpath解析。
关于符号解析过程中的潜在冲突:
在编译时、链接时或运行时不会发现动态共享库之间的名称冲突。dlsym 函数使用字符串匹配来查找符号。如果两个库对函数使用相同的名称,则动态加载器将返回第一个与给定 dlsym 的符号名称匹配的库。
因此,如果两个插件使用相同的库,多个副本不会使程序崩溃。如果他们期望同名的不同库,那就是一个大问题,你应该使用版本兼容机制 - 请参阅动态库设计指南
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |