我有一个C ++程序,它在运行时链接,比方说,mylib.so。然后,同一个程序使用dlopen()/ dlsym()从myplugin.so加载一个函数,动态库又依赖于mylib.so。
我的问题是:插件中的程序和函数是否会在为程序保留的同一内存区域中访问mydlib.so中定义的相同全局变量,或者每个都将在其自己的内存空间中分配不同的,不相关的副本?如果后者是默认行为,是否可以改变它?
提前致谢=)!
答案 0 :(得分:1)
执行dlopen
的主程序中的全局变量应该对动态加载的代码可见。但是,我迄今为止看到的最好的建议(特别是如果你想拥有甚至模糊的可移植代码)只是通过链接器除法传递函数调用,并且不向任何方向导出任何变量。如果有加载代码的API用加载器注册其API的有趣部分也是最好的(例如,“这是我如何提供这个SPI用于在baz上绘制foobars”)因为这是一个很大的做回调的更健全的方式,而不仅仅是将所有东西混合在一起。
[编辑]:这样做的另一个原因是,如果您在不支持它的平台上模拟弱链接。这与我列出的另一个很相似,不同之处在于它是由动态库导出的API构建SPI的主程序,而不是在启动时显式导出它的.so
。它确实是第二好的,但是你用你所拥有的而不是希望(除非你准备通过编写某种连接库来完成工作)。