在运行dlopen的插件之间共享的运行时链接库全局变量?

con*_*roy 5 c++ linux gcc dynamic globals

我有一个C++程序,它在运行时链接,比方说,mylib.so.然后,同一个程序使用dlopen()/ dlsym()从myplugin.so加载一个函数,动态库又依赖于mylib.so.

我的问题是:插件中的程序和函数是否会在为程序保留的同一内存区域中访问mydlib.so中定义的相同全局变量,或者每个都将在其自己的内存空间中分配不同的,不相关的副本?如果后者是默认行为,是否可以改变它?

在此先感谢=)!

Don*_*ows 1

主程序中执行此操作的全局变量dlopen应该对动态加载的代码可见。然而,迄今为止我看到的最好的建议(特别是如果您想要拥有模糊的可移植代码)是仅让函数调用跨链接器划分传递,并且不要在任一方向导出任何变量。如果有一个 API 可以让加载的代码向加载器注册其 API 的有趣部分(例如,“这是我如何提供此SPI用于在 baz 上绘制 foobars”),因为这是一种更明智的做法回调而不是仅仅将所有内容混在一起。

[编辑]:这样做的另一个原因是如果您在不支持弱链接的平台上模拟弱链接。这与我列出的另一个程序非常相似,只不过它是主程序,它利用动态库导出的 API 构建 SPI,而不是.so在启动时显式导出它。这实际上是第二好的,但是你可以用你所拥有的而不是希望的来凑合(好吧,除非你准备通过编写某种连接库来完成这项工作)。