运行时链接库全局变量在使用dlopen加载的插件之间是否共享?

5
我有一个C++程序,它在运行时链接了mylib.so库。然后,同样的程序使用dlopen()/dlsym()从myplugin.so动态库中加载一个函数,该动态库反过来依赖于mylib.so。
我的问题是:程序和插件中的函数是否会访问在程序内存中为mydlib.so定义的相同全局变量,还是每个变量将被分配到自己的内存空间中的不相关副本?如果后者是默认行为,是否可以更改这种行为?
提前感谢 =)!
1个回答

1
在执行 dlopen 的主程序中的全局变量应该对动态加载的代码可见。然而,迄今为止我看到的最好建议(特别是如果您想拥有甚至是稍微可移植的代码)是仅将函数调用传递到链接器分界线,并且不导出任何变量。最好还有一个 API,使得加载的代码可以向加载器注册其 API 的有趣部分(例如,“这就是我如何为绘制 foobars 提供此 SPI 在 baz 上”的方式),因为这比将所有内容混在一起做回调要明智得多。
[编辑]:这样做的另一个原因是,如果您在不支持弱链接的平台上模拟它。 这很像我列出的另一个原因,只是现在是主程序根据动态库导出的 API 来构建 SPI,而不是 .so 在启动时显式导出它。这实际上是次优解,但您必须利用现有条件,而不仅仅是希望(除非您准备通过编写某种连接库来完成工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接