在标准库中静态链接时,如何支持动态插件

How to support dynamic plugins when statically linking in standard libraries?

本文关键字:何支持 支持 插件 动态 标准 静态 链接      更新时间:2023-10-16

假设应用程序myapp.exe是使用g++构建的,并且它使用标志-static-libstdc++,以便可以将其安装在没有libstdc++.so的环境中。myapp.exe还为某些功能plugf添加了插件支持,这些功能可以通过shard库通过dlopen动态加载。

如果libplug.so是这样的插件库,也链接到libstdc++,那么它如何以一种能够与myapp.exe一起使用的方式?

如果libstdc++在动态上链接,这很简单,因为myapp.exelibplug.so都可以使用相同的动态加载标准库,但是我尚不清楚如何最好使用静态链接的标准库来完成此操作。

我正在考虑的一种方法是让libplug.so也使用标志-static-libstdc++,然后使用版本脚本

{
  global: plugf;
  local: *;
};

确保使用其标准库的版本,但这意味着将有两个加载到内存中的libstdc++的副本。我知道这种方法不会受到C 标准的祝福,因为它会违反Ord违规,但是libstdc++可以以任何方式支持吗?手册部分的Multiple ABI testing部分确实引用了听起来相似的场景。

是的,此解决方案可以起作用,但

  • 由于代码重复,它引入了某些开销
  • ,由于您最近的libstdc
  • 在插件/应用程序之间尝试传递插件/应用程序之间的stl对象,它可能会破裂。

删除由std::allocator在不同C 运行时分配的对象应该在Linux上工作,尽管我在LibstDC 文档中找不到有关此的明确说明。当Mikhail在评论中指出时,它确实在Windows上失败。