macos - 当两个 macOS .plugin 依赖于同一个 .dylib 并且每个都将它分别捆绑在插件文件夹中时会发生什么?

标签 macos plugins dynamic-linking dylib

我有两个插件 pluginA.pluginpluginB.plugin两者都依赖于同一个库 libC.dylib .构建插件时,我递归地检查动态依赖项(使用 otool -L ),复制每个插件中的所有依赖项 libs文件夹并使用 install_name_tool 调整依赖项路径,即“随身携带我所有的东西”的方法。

我试图了解当某些程序加载这两个插件时会发生什么?威尔libC.dylib被加载两次,这会导致运行时崩溃?或者运行时会意识到有两个相同 dylib 的副本(基于版本?)并且只使用一个?

最佳答案

Apple 的 Dynamic Library Usage Guidelines 中描述了动态库搜索和加载的顺序。

简而言之,如果插件中依赖库的路径匹配,则该库将仅加载一次。在每次下一次加载时,只会增加内部计数器:

The dlopen function returns the same library handle it returned in the first call, but it also increments the reference count associated with the handle



如果库的路径不同于库的不同副本将被加载。

备注 : 在检查库是否已经加载时,使用它的绝对路径。它可以直接在依赖中设置,在全局目录中搜索时发现或从@rpath 解析。

关于符号解析过程中的潜在冲突:

Name conflicts between dynamic shared libraries are not discovered at compile time, link time, or runtime. The dlsym function uses string matching to find symbols. If two libraries use the same name for a function, the dynamic loader returns the first one that matches the symbol name given to dlsym.



因此,如果两个插件使用相同的库,则多个副本不会使程序崩溃。如果他们期望同名的不同库比这是一个大问题,你应该使用版本兼容性机制 - 见 Dynamic Library Design Guidelines

关于macos - 当两个 macOS .plugin 依赖于同一个 .dylib 并且每个都将它分别捆绑在插件文件夹中时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57103528/

相关文章:

c++ - 一个简单的c++程序的编译过程

java - 如何验证已编译 Java 代码之间的链接?

objective-c - 双击 NSOutlineView 的标题是否触发双击方法?

macos - 以编程方式快速格式化字符串

macos - 将项目添加到除默认值之外的特定 OS X 钥匙串(keychain)

macos - 一次可以打开多少个安全范围的书签?

ruby-on-rails - 如何强制我的插件随每个请求重新加载?

c++ - 当我在 Linux 上使用 STL 编译 C++ 程序时,STL 库是如何链接的?

asp.net - 如何在asp.net中使用jquery表单插件?

c# - 在 Visual Studio 中调试插件