5

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

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

提前感谢=)!

4

1 回答 1

1

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

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

于 2010-05-07T10:03:10.083 回答