在输出 objdump -t 的结果中,".hidden" 是什么意思?

12

例子:

$ objdump Logger.cpp.o  -t

00000000 g     F .text  00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
2个回答

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

我正在使用库来静态链接我的可执行文件。问题是,我在两个不同的库中定义了上述符号,这两个库都是隐藏的。由于重复符号,链接失败了。如果我理解你正确的话,这种情况不应该发生,对吗? - MBober
3
@MBober:不,链接器在那种情况下产生错误是正确的。请记住,静态库基本上是一组目标文件的存档,当静态库被链接时,所有这些目标文件都成为链接器的输入。符号可见性会影响链接器(可执行文件或动态库)的输出,但如果两个或多个目标文件定义了相同的符号,仍然会出现链接错误。 - Daniel Trebbien

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!

在使用可见性属性时,使用示例和潜在陷阱


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接