linker - 在调试信息压缩标志的各种组合下,汇编器和链接器之间的压缩调试信息如何流动?
问题描述
gcc 和 binutils 中有许多关于调试信息压缩的标志。在这里,我对标准 C++ 项目中以下四个标志之间的相互作用感兴趣,该项目使用编译器创建许多目标文件,然后使用编译器驱动将目标文件组合成各种最终二进制文件的链接步骤:
-Wa,--compress-debug-sections=zlib-gabi
-Wa,--nocompress-debug-sections
-Wl,--compress-debug-sections=zlib-gabi
-Wl,--compress-debug-sections=none
所以,我们可以想象四种可能性。我们已经编译了我们的目标文件,无论是在汇编-Wa,--compress-debug-sections=zlib-gabi
器中还是使用-Wl,--compress-debug-sections=zlib-gabi
.
-Wa,--nocompress-debug-sections
compile 和 compile的组合-Wl,--compress-debug-sections=none
是无趣的。大概根本没有发生压缩。
接下来的两个组合更有趣:
对于
-Wa,--compress-debug-sections=zlib-gabi
汇编器和-Wl,--compress-debug-sections=none
链接器,链接器似乎需要花时间从每个目标文件中解压缩调试信息,然后再合并它并为最终二进制文件发出新的未压缩调试信息部分。对于
-Wa,--nocompress-debug-sections
汇编器和-Wl,--compress-debug-sections=zlib-gabi
链接器,显然汇编器不会花时间压缩目标文件的调试信息,而链接器会花时间压缩最终合并的调试信息部分。
我对这两种情况的假设和理解大多正确吗?如果不是,我误解了什么?
这留下了最有趣的情况:
- 对于
-Wa,--compress-debug-sections=zlib-gabi
汇编器和-Wl,--compress-debug-sections=zlib-gabi
链接器,这里会发生什么?如果我对上述情况的理解是正确的,我希望汇编器会做工作来压缩每个目标文件中的调试信息,然后链接器需要花时间解压缩它,然后进行合并,最后重新压缩合并调试信息部分。那是对的吗?或者链接器是否能够以某种方式神奇地直接将目标文件中的压缩调试信息部分直接合并到链接步骤的最终压缩调试信息部分中,从而避免解压缩/重新压缩循环?
总的来说,我只是想了解我应该在构建系统中将这些标志默认为什么以获得最佳构建性能。我当然会做一些基准测试,但我也有兴趣了解这里的操作理论,因为它将帮助我了解围绕这些标志的任何构建基准测试结果。
解决方案
可悲的是,我对这个话题并不了解。
但是,我偶然发现了以下内容,这可能会回答您问题的第一部分。
最近, -Wa,--compress-debug-sections 选项已可用。此选项将发送到链接器的目标文件的总大小减少了三分之一以上,因此调试信息现在占目标文件总大小的 70-80%。输出文件不受影响:链接器解压调试信息以便链接,并输出未压缩的结果(链接时有重新压缩调试信息的选项,但此步骤只会减小输出文件的大小改善链接时间或内存使用)。
来自:https ://gcc.gnu.org/wiki/DebugFission (部分:调试信息大小问题)
所以,看看那句话,你对这两种情况的假设似乎是正确的:
-Wa,--compress-debug-sections=zlib-gabi
和-Wl,--compress-debug-sections=none
-Wa,--nocompress-debug-sections
和-Wl,--compress-debug-sections=zlib-gabi
推荐阅读
- c - fgets while 循环,编译器警告有关无效语句的语句
- python - 使用 toch log_prob 计算选择分布本身的多个值的概率
- flutter - Flutter:如何在 ListView.builder 中保存小部件状态
- visual-studio-code - Vscode 不断在我的行中添加空格(缩进)
- java - fxml 文件不会加载
- python - 如何在python中更准确地找到局部最大值(最小值)?
- encryption - 有没有办法下载受 Apple FairPlay DRM 保护的视频?
- python - 无法在 Docker 运行中运行 python 文件 - docker:无效的引用格式和 docker:来自守护程序的错误响应
- javascript - JS CLI RPS 游戏问题
- python - TensorFlow 对象检测,检测对象的性能很差