".hidden"输出对象转储 -t 的输出是什么意思?

What does ".hidden" mean in the output of output objdump -t?

本文关键字:输出 是什么 意思 转储 hidden 对象      更新时间:2023-10-16

示例:

$ objdump Logger.cpp.o  -t
00000000 g     F .text  00000000 .hidden __sti___10_Logger_cpp_0b2ae32b

这意味着符号的可见性是隐藏的:https://developer.apple.com/library/archive/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。

解释

可见性支持的链接(适用于 gcc)

从链接:

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

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

  • 它将DSO的大小减少5-20%。ELF 导出的品种表格式占用了大量空间,给出了完整的损坏符号名称,使用大量模板平均约为 1000 字节。C++模板会喷出大量的符号,一个典型的C++库可以轻松超过 30,000 个符号,大约 5-6Mb!因此,如果您删除 60-80% 的不必要符号,您的 DSO 可能会更小几兆字节!

  • 符号冲突的可能性要低得多。两个库内部使用相同的符号表示不同事物的旧祸终于在这个补丁中消失了。哈利路亚!

尽管上面引用的库是一个极端情况,但新的可见性支持将导出的符号表从 200,000 个符号>减少到不到 18,000 个符号。一些 21Mb 也被取消了二进制大小!

使用

示例以及使用可见性属性时的潜在陷阱