您好,我刚接触DWARF标准和ELF格式。我有几个问题。我正在使用DWARF 2标准,并且对DIE的工作原理有相当基本的了解,我需要更加清楚地了解它们如何以字节表示。
ELF Wiki提供了一个很好的表,按字节顺序将字节按顺序放在程序头,节和段中。但是,对于DWARF 2标准,以字节表示DIE的正确方法是什么?
我试图深入研究Dwarf Standards pdf文档,以尝试了解DIE如何以字节表示。也许我缺少一部分?
我想使用此信息来删除某些DIE,以节省调试部分的空间。我只对提供可变地址的DIE感兴趣。
答案 0 :(得分:0)
page 66在7.5.2和7.5.3节中对此格式进行了说明。
appendix 2, page 93中的示例更加清晰:
每个DIE引用.debug_abbrev
中的相应条目,该条目定义了给定的DIE“签名”,即
DW_TAG_*
)DW_AT_*
)及其形式(DW_FORM_*
)。DIE的格式为:
答案 1 :(得分:0)
我建议从DWARF开始的任何人都以Introduction to the DWARF Debugging Format开始。这是一个非常简洁的概述,为进一步深入探讨该格式提供了良好的基础。有了这种背景,就可以编译一个非常简单的程序的调试版本,并将两个ELF节.debug_abbrev
和.debug_info
的十六进制转储与dwarfdump
或readelf
的输出进行比较
一旦您对DIE的编码有了广泛的了解,您就会发现,简单地从.debug_info
删除其相应的字节会破坏整个文件—就DWARF和ELF而言。例如,每个DIE都通过其相对文件偏移量来标识;删除一个DIE的字节将改变所有后续DIE的偏移量,因此对它们的任何引用都将被破坏。一个可靠的解决方案将需要解析DWARF以创建树的内部表示形式,然后再消除不需要的节点并写出新的DWARF。修改.debug_info
后,您需要编辑ELF本身的结构:至少,这将涉及更新节头表以反映任何已移动节的新偏移量并更新任何重定位。>
如果您主要关心的是节省空间,那么我建议您研究一下您拥有哪些编译器选项。例如,Oracle Studio编译器允许对DWARF中包含的内容进行精细控制。根据您的编译器和操作系统,也可能会发出带有压缩DWARF节的文件(例如.zdebug_info
),甚至可能完全将DWARF留在不同的文件中。 DWARF膨胀的问题是众所周知的,如果您有兴趣自己解决低水平的问题,可以在Michael Eager的introduction和标准的更高版本中找到其他建议。