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

时间:2017-12-16 01:41:31

标签: c++ gcc ld libstdc++

假设使用myapp.exe构建了应用g++,并使用了标记-static-libstdc++,以便可以在没有libstdc++.so的环境中安装它。 myapp.exe还为某些函数plugf添加了插件支持,可以通过dlopen从分片库动态加载。

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

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

我考虑的方法是让libplug.so也使用标记-static-libstdc++,然后使用version script

{
  global: plugf;
  local: *;
};

确保使用其标准库版本,但这意味着会有两个libstdc++副本加载到内存中。我知道这种方法不会被C ++标准祝福,因为它会有ORD违规,但它是libstdc++以任何方式支持的东西吗? manual部分的Multiple ABI testing部分确实引用了类似的情景。

1 个答案:

答案 0 :(得分:1)

是的,这个解决方案可行,但

删除由std::allocator在不同C ++运行时分配的对象应该可以在Linux上运行,尽管我在libstdc ++ docs中找不到关于此的明确声明。正如米哈伊尔在评论中指出的那样,它确实在Windows上失败了。