输出objdump -t的输出中“.hidden”是什么意思?

时间:2012-07-04 13:06:35

标签: c++ c objdump

示例:

$ objdump Logger.cpp.o  -t

00000000 g     F .text  00000000 .hidden __sti___10_Logger_cpp_0b2ae32b

2 个答案:

答案 0 :(得分:1)

这意味着隐藏了符号的可见性:https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

更改符号可见性的原因包括:

  • 减少符号冲突的风险。
  • 较小的二进制文件。
  • 缩短了启动时间,因为动态链接器不需要处理任意多个符号。
  • 提高代码效率的机会,因为编译器知道无法通过LD_PRELOAD类型系统覆盖符号。
  • 防止第三方软件调用未记录的API。

有关详细信息,请参阅http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html

答案 1 :(得分:1)

解释visibility support(对于gcc)

的链接

从链接:

  • 它极大地改善了DSO(动态共享对象)的加载时间。例如,一个经过测试的巨大的基于C ++模板的库(TnFOX Boost.Python绑定库)现在可以在8秒内加载而不是超过6分钟!

  • 它可以让优化器生成更好的代码。 PLT间接(当必须通过全局偏移表(例如PIC代码)查找函数调用或变量访问时)可以完全避免,从而基本上避免现代处理器上的流水线停顿,从而更快地编码。此外,当大多数符号在本地绑定时,可以通过整个DSO完全安全地删除(删除)它们。这样可以提供更大的自由度,特别是内联器不再需要保持“以防万一”的入口点。

  • 它将您的DSO大小减少了5-20%。 ELF的导出符号表格式非常耗费空间,给出了完整的错位符号名称,模板使用量很大,平均大约1000字节。 C ++模板喷出大量符号,典型的C ++库可以轻松超过30,000个符号,大约5-6Mb!因此,如果您删除了60-80%的不必要符号,那么您的DSO可能会减少兆字节数!

  • 符号碰撞的几率低很多。内部使用相同符号表示不同内容的两个库的旧问题最终落后于我们这个补丁。哈利路亚!

尽管上面引用的库是一种极端情况,但新的可见性支持从>>中减少了导出的符号表。 200,000个符号,小于18,000个。大约21Mb也被淘汰了二进制大小!

使用visibilty属性时的usage sample and also potential pitfall