我有一个代号为的程序foo.foo取决于common.so并以正常方式与它相关联(抱歉,我不知道技术方式).何时foo运行它然后bar.so使用动态加载dlopen().到现在为止还挺好.
但是,bar.so也取决于common.so.是否会dlopen()重新加载common.so(从我读过的内容中递归加载任何所需的依赖项),还是会检测到它已经加载了?如果它重新加载它,是否会导致我的程序出现问题?双方foo并bar.so需要看到的变化common.so,要么他们做出静态变量存在.
也许我的设计需要改变或需要使用-rdynamic(我还不太了解)?
即使在引用可执行目标文件时多次调用 dlopen(),并且即使使用不同的路径名来引用可执行目标文件,也只能将可执行目标文件的单个副本带入地址空间。
在 Linux 上,这是使用引用计数来实现的;直到dlclose被调用相同次数为止,共享对象将保持驻留。
[更新]
我知道您正在询问作为依赖项隐式加载的共享对象,但同样的原则也适用。否则,很多事情都会被破坏......特别是,共享对象中的全局构造函数将运行多次,这会造成严重破坏。