2011-09-29 80 views
2

我有一个用C++编写的巨大项目。它全部分成多个静态库,最终链接到一个最终的共享库,该库仅导出一些简单的功能。用C++编写的共享对象的GCC正确可见性

如果我这样做是objdump的最后。所以我看到我所有的内部名称等,因为它使用长的类名和命名空间这些字符串变得过长,因此最终的二进制大的。

所以,我的问题是我怎么做正确与海湾合作委员会,以确保所有的内部功能不会在最终的二进制显示?

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

我试图用轮候册, - 版本脚本=控制哪些功能应该是可见的,但我仍然看到内部名称的大量的最终剥离共享对象。我读过多个类似的条目,但没有看到任何工作。 注:我编译的多平台(Linux,Windows,iPhone等),只在VS的窗口我没有任何问题。

感谢

回答

4

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

+0

我现在试试这个选项,看看二进制文件是否会运行。从简单的测试中,我发现来自其他共享库的导入函数的名称不再位于二进制文件中。我是否也需要列出导入的名称? – Pavel

+0

克里斯,这似乎是我需要的选项。最后.so通过几个megs和nm列表更细,只列出了我输入到输出文件中的符号。第一个问题:我使用很多静态库,一些导出必须来自这些静态库,出于某种原因,这些来自静态库的符号不会被导出。为了解决这个问题,我不得不使用整个归档选项来强制从这些库中导出所有函数。 – Pavel

+0

第二个问题是,即使nm现在只列出了导出文件中的函数,如果我使用objdump,我仍然从我的C++代码中获得私有名称。例如:_ZN20RCSFTServiceImplPeer12onFTProgressERKN3RCS12FileTransferEy我的目标是做任何事情,以便这些字符串不在最终的二进制文件中。 – Pavel