c – dlopen是否重新加载已加载的依赖项?如果是这样,有什么影响?

我有一个代号为foo的程序. foo取决于common.so并且以正常方式链接到它(抱歉,我不知道技术方​​式这么说).当foo运行时,然后使用dlopen()动态加载bar.so.到现在为止还挺好.

但是,bar.so也取决于common.so. dlopen()会重新加载common.so(从我读过的内容中递归加载任何所需的依赖项),还是会检测到它已经加载了?如果它重新加载它,是否会导致我的程序出现问题? foo和bar都需要看到常见的变化,因为它们中的任何一个都会产生静态变量.

也许我的设计需要改变或需要使用-rdynamic(我还不太了解)?

最佳答案
POSIX spec for dlopen()说:

Only a single copy of an executable object file shall be brought into
the address space, even if dlopen() is invoked multiple times in
reference to the executable object file, and even if different
pathnames are used to reference the executable object file.

在Linux上,这是使用引用计数实现的;直到dlclose被调用相同的次数,共享对象将保持驻留.

[更新]

我意识到你问的是隐式加载为依赖关系的共享对象,但同样的原则适用.否则,很多事情都会破坏……特别是,共享对象中的全局构造函数会运行多次,这会造成严重破坏.

转载注明原文:c – dlopen是否重新加载已加载的依赖项?如果是这样,有什么影响? - 代码日志