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

问题描述 投票:2回答:1

假设应用程序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++以任何方式支持的东西?它的Multiple ABI testing部分的manual部分确实引用了一个听起来相似的场景。

c++ gcc ld libstdc++
1个回答
1
投票

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

  • 由于代码重复,它引入了一定的开销
  • 如果你因为ABI changes in recent libstdc++尝试在插件/应用程序之间传递STL对象,它可能会中断

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

© www.soinside.com 2019 - 2024. All rights reserved.