12

例子:

$ objdump Logger.cpp.o  -t

00000000 g     F .text  00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
4

2 回答 2

3

这意味着符号的可见性被隐藏: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

于 2012-07-04T13:16:23.027 回答
1

解释可见性支持的链接(用于 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!

A usage sample and also potential pitfall when using visibilty attribute

于 2012-07-04T13:32:20.950 回答