【问题标题】:In GCC, how can I export all typeinfo symbols for a shared library without exporting all symbols?在 GCC 中,如何在不导出所有符号的情况下导出共享库的所有 typeinfo 符号?
【发布时间】:2012-02-06 05:36:42
【问题描述】:

问题来了:

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

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

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

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

【问题讨论】:

  • 也许通过处理nm 或类似的输出动态生成链接器脚本?只是猜测。
  • 这可能是个不错的选择。我已经考虑过了,虽然我不喜欢额外的脚本工作,但它可能是最好的答案。感谢您的建议!

标签: c++ gcc linker visibility typeinfo


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2021-08-05
    相关资源
    最近更新 更多