2

我有一个用 C++ 编写的大型项目。它全部拆分为多个静态库,这些静态库最终链接到一个最终共享库,该共享库只需要导出几个简单的函数。

如果我对最终的 .so 执行 objdump,我会看到我所有的内部名称等。因为它使用长类名和命名空间,这些字符串变得过长,因此最终二进制文件很大。

所以,我的问题是如何正确使用 GCC 来确保所有这些内部函数都不会出现在最终的二进制文件中?

我知道所有这些 GCC 特定的可见性修饰符,我使用 -fvisibility=hidden -fvisibility-inlines-hidden,我使用 -Wl,--no-whole-archive。我禁用了 c++ 异常和 rtti (-fno-exceptions -fno-rtti),但我仍然无法让 GCC 生成我的最终 .so 它不包含我的命名空间和不应该存在的类的名称全部!

我尝试使用 -Wl,--version-script= 来控制哪些函数应该可见,但我仍然在最终剥离的共享对象中看到了很多内部名称。我在 SO 上阅读了多个类似的条目,但没有看到任何可以完成这项工作的内容。注意:我为多个平台(Linux、Windows、iPhone 等)编译,并且只在 VS 中的 Windows 上编译,我没有任何问题。

谢谢

4

1 回答 1

4

--retain-symbols-file在链接最终的 .so 文件 ( ) 时,您可能想尝试使用链接器选项-Wl,--retain-symbols-file=filename来指定您想要保留(导出)的符号并删除其他所有内容。该文件只是一个带有符号(每行一个)要保留的文本文件。

于 2011-09-29T18:38:51.543 回答