【发布时间】:2020-04-08 22:12:15
【问题描述】:
在 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 和-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连接到链接器,这里会发生什么?如果我对上述情况的理解是正确的,我希望汇编器会做工作来压缩每个目标文件中的调试信息,然后链接器需要花时间解压缩它,然后进行合并,最后重新压缩合并调试信息部分。那是对的吗?或者链接器是否能够神奇地直接将目标文件中的压缩调试信息部分直接合并到链接步骤的最终压缩调试信息部分中,从而避免解压缩/重新压缩循环?
总的来说,我只是想了解在构建系统中我应该将这些标志默认为什么以获得最佳构建性能。我当然会做一些基准测试,但我也有兴趣了解这里的操作理论,因为它将帮助我了解围绕这些标志的任何构建基准测试结果。
【问题讨论】:
标签: linker compression binutils