GCC对用C ++编写的共享对象的正确可见性

时间:2011-09-29 18:09:39

标签: gcc strip objdump

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

如果我对该决赛进行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上编译我没有任何问题。

感谢

1 个答案:

答案 0 :(得分:4)

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