主程序中执行此操作的全局变量dlopen应该对动态加载的代码可见。然而,迄今为止我看到的最好的建议(特别是如果您想要拥有模糊的可移植代码)是仅让函数调用跨链接器划分传递,并且不要在任一方向导出任何变量。如果有一个 API 可以让加载的代码向加载器注册其 API 的有趣部分(例如,“这是我如何提供此SPI用于在 baz 上绘制 foobars”),因为这是一种更明智的做法回调而不是仅仅将所有内容混在一起。
[编辑]:这样做的另一个原因是如果您在不支持弱链接的平台上模拟弱链接。这与我列出的另一个程序非常相似,只不过它是主程序,它利用动态库导出的 API 构建 SPI,而不是.so在启动时显式导出它。这实际上是第二好的,但是你可以用你所拥有的而不是希望的来凑合(好吧,除非你准备通过编写某种连接库来完成这项工作)。