在GCC中,如何在不导出所有符号的情况下导出共享库的所有typeinfo符号?

Wil*_*ode 5 c++ linker gcc visibility typeinfo

这是问题所在:

我有一个默认隐藏符号的共享库.实际上,它使用-Xlinker --version-script =选项导出特定文件中的某些符号,但隐藏所有其余符号.问题是如果我们尝试捕获在其他共享库中定义的异常,我们就会遇到问题,因为这个共享库隐藏了typeinfo.我无法显式地使异常类可见,因为它们是在我无法控制的开源库中定义的.我也不想在版本脚本符号文件中明确列出异常类的typeinfo的错位名称,因为有许多开发人员正在处理这个库,并且他们必然会忘记为某些异常类执行此操作.未来.

我尝试在开源.hpp文件之前使用#pragma GCC可见性推送(默认),但它似乎不起作用 - 符号不可见.

我也尝试使用-fvisibility-ms-compat,它确实导出了typeinfo符号,但也导出了大量其他我不想导出的符号.该库中包含C和C++代码,因此我不确定如何使用仅适用于C++的此选项.

我真正需要的是一个选项,它将使所有typeinfo符号可见,同时保留其他符号(除非它们是明确可见的).有这样的选择吗?

rto*_*ert 3

您的问题最直接的答案是尝试 ld 选项--dynamic-list-cpp-typeinfo。我在这个选项上运气不佳,但是 YMMV。

您没有说明您正在哪个平台上构建。表面上你正在使用 mingw,因为你已经尝试过了-fvisibility-ms-compat;但万一您实际上使用的是 Linux 等 ELF 目标,请尝试从版本脚本中导出符号通配符_ZTI*和。_ZTN*(您可能可以在 Windows 上执行类似的操作,但就 Visual C++ 名称修饰并未真正记录下来而言,我不知道您可以使用任何预制通配符。)