Linker 在调试信息压缩标志的各种组合下,压缩的调试信息如何在汇编程序和链接器之间流动?
在gcc和binutils中,调试信息压缩有许多标志。这里,我感兴趣的是标准C++类项目中的以下四个标志之间的相互作用,它用编译器创建多个对象文件,然后使用编译器驱动将对象文件合并到各种最终二进制文件中的链接步骤:Linker 在调试信息压缩标志的各种组合下,压缩的调试信息如何在汇编程序和链接器之间流动?,linker,compression,binutils,Linker,Compression,Binutils,在gcc和binutils中,调试信息压缩有许多标志。这里,我感兴趣的是标准C++类项目中的以下四个标志之间的相互作用,它用编译器创建多个对象文件,然后使用编译器驱动将对象文件合并到各种最终二进制文件中的链接步骤: -Wa,--compress debug sections=zlib gabi -Wa,--nocompress调试部分 -Wl,--compress debug sections=zlib gabi -Wl,--compress debug sections=none 因此,我
-Wa,--compress debug sections=zlib gabi
-Wa,--nocompress调试部分
-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
总的来说,我只是想了解为了获得最佳构建性能,在构建系统中应该将这些标志默认为什么。我当然会做一些基准测试,但我也有兴趣了解这里的操作理论,因为它将帮助我了解围绕这些标志的任何构建基准测试结果。遗憾的是,我不了解这个主题。
然而,我偶然发现了以下可能回答你问题的第一部分 最近,-Wa,--compress debug sections选项可用。此选项将发送到链接器的对象文件的总大小减少三分之一以上,因此调试信息现在占对象文件总大小的70-80%。输出文件不受影响:链接器解压缩调试信息以链接它,并输出未压缩的结果(有一个选项可在链接时重新压缩调试信息,但此步骤只会减少输出文件的大小,而不会改善链接时间或内存使用) 来自:(部分:调试信息大小问题) 因此,看看这段引文,你对这两种情况的假设似乎是正确的:
和-Wa,--compress debug sections=zlib gabi
-Wl,--compress debug sections=none
和-Wa,--nocompress debug sections
-Wl,--compress debug sections=zlib gabi