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

时间:2010-05-07 07:42:13

标签: c++ linux gcc dynamic globals

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

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

提前致谢=)!

1 个答案:

答案 0 :(得分:1)

执行dlopen的主程序中的全局变量应该对动态加载的代码可见。但是,我迄今为止看到的最好的建议(特别是如果你想拥有甚至模糊的可移植代码)只是通过链接器除法传递函数调用,并且不向任何方向导出任何变量。如果有加载代码的API用加载器注册其API的有趣部分也是最好的(例如,“这是我如何提供这个SPI用于在baz上绘制foobars”)因为这是一个很大的做回调的更健全的方式,而不仅仅是将所有东西混合在一起。

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