".hidden"输出对象转储 -t 的输出是什么意思?
What does ".hidden" mean in the output of output objdump -t?
示例:
$ 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 也被取消了二进制大小!
使用示例以及使用可见性属性时的潜在陷阱
- 为对象分配整数.输出将是什么?
- 以下与指针相关的代码的输出是什么?
- 从 c++ 中的实例化进程获取输出的可靠方法是什么?
- 我的输出结果是 0 英寸C++.可能是什么问题
- 以下程序在 c++ 中的输出是什么?
- 任何人都解释下面的代码,它的输出是什么?
- 这段代码的输出是什么,它在构造函数中使用 strcpy?
- 以下代码的输出是什么(答案因差异编译器而异)
- 该代码将如何工作以及输出的输出是什么
- 这里发生了什么,还有输出是什么?(无线索)
- 此代码的输出是什么?我在这里错过了什么吗?
- 假设动态范围,以下C++程序的输出是什么
- "cout << (a, b)"的输出是什么,为什么?
- ".hidden"输出对象转储 -t 的输出是什么意思?
- c中的fork()命令——这段简单代码的输出是什么
- 例外C++,我只是不明白为什么输出是什么
- 以下代码的输出是什么?
- 这段代码的输出是什么?
- 这个Valgrind输出是什么意思?
- 下面代码的输出是什么?