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

时间:2012-01-09 17:31:48

标签: c++ gcc linker visibility typeinfo

问题在于:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

您问题的最直接答案是尝试使用ld选项--dynamic-list-cpp-typeinfo。我对这个选项没有好运,但YMMV。

您没有说明您正在构建哪个平台。表面上你是在使用mingw,因为你已经尝试-fvisibility-ms-compat;但实际上你实际上在像Linux这样的ELF目标上,请尝试从你的版本脚本中导出符号通配符_ZTI*_ZTN*。 (你可以在Windows上做类似的事情,但是因为Visual C ++名称修改没有真正记录,我不知道你可以使用任何罐装通配符。)