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

标签 c++ gcc dlopen

我有一个程序,代号为foofoo 依赖于 common.so 并以正常方式链接到它(抱歉,我不知道从技术角度来说)。当 foo 运行时,它会使用 dlopen() 动态加载 bar.so。到目前为止一切顺利。

但是,bar.so 也依赖于 common.sodlopen() 会重新加载 common.so(根据我的阅读,它会递归加载任何所需的依赖项),还是会检测到它已经加载?如果它确实重新加载它,这会导致我的程序出现问题吗? foobar.so 都需要查看 common.so 中的任何一个对静态变量所做的更改。

也许我的设计需要更改或需要使用 -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 是否重新加载已经加载的依赖项?如果是这样,有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32302262/

相关文章:

C++:在 DLL 中绑定(bind)类函数

c++ - 如何在其他 src 文件夹中包含头文件

c - dlopen:是否可以捕获未解析的符号, "manually"在它们发生时解析它们?

c++ - 我可以模板化用户定义的文字吗?

c++ - 未找到 'vtkPolyDataMapper' 的覆盖

c - 在 GCC 中链接 libssl 和 libcrypto

c - 如何在 QNX Momentics 6.5 中使用不同的编译标准?

编译器优化导致程序运行速度变慢

c++ - dopen() : "failed to map segment from shared object" when not running as root

c++ - 在自定义库位置的情况下使用 dlopen 加载依赖库