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

5
这里的问题是:
我有一个共享库,默认情况下隐藏了一些符号。实际上,它使用"-Xlinker --version-script="选项来将某些符号导出到指定的文件中,但是隐藏了所有其他符号。问题在于,如果我们尝试捕获在其他共享库中定义的异常,我们会遇到问题,因为此共享库隐藏了typeinfo。我不能显式地使异常类可见,因为它们在开源库中定义,并且超出了我的控制范围。我也不想在版本脚本符号文件中显式列出异常类的typeinfo的mangled名称,因为有许多开发人员在处理该库,他们肯定会忘记为将来的某些异常类执行此操作。
我尝试在开源.hpp文件之前使用#pragma GCC visibility push(default),但它似乎没有起作用-符号并不可见。
我还尝试使用-fvisibility-ms-compat,它确实导出了typeinfo符号,但也导出了我不想要导出的大量其他符号。该库同时包含C和C++代码,因此我不确定如何使用此仅用于C++的选项。
我真正需要的是一种选项,可以使所有typeinfo符号可见,同时隐藏其他符号(除非它们明确可见)。是否有这样的选项?

也许可以通过处理“nm”命令的输出或类似的方式动态生成链接器脚本?只是猜测。 - n. m.
这可能是一个不错的选择。我已经考虑过了,虽然我不喜欢额外的脚本工作,但这可能是最好的答案。谢谢你的建议! - Will Brode
1个回答

3
尝试使用ld选项 --dynamic-list-cpp-typeinfo ,这是回答您问题的最直接方法。但我并没有很好的运气,但也许您会有所收获。
您没有说明正在构建哪个平台。可能你正在使用mingw,因为你尝试了-fvisibility-ms-compat;但如果您实际上在像Linux这样的ELF目标上,请尝试从您的版本脚本中导出符号通配符 _ZTI*_ZTN*。 (您可能可以在Windows上做类似的事情,但是鉴于Visual C ++名称编码并未真正记录文档,我不知道您可以使用哪些常用通配符。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接