自从我的提案被 GSoC'20 接受以来已经过去一个月。我学到了很多,度过了一段美好的时光。此外,我们在实现目标方面也取得了一些进展。因此,现在是回顾我在第一个编码周期中所做的工作和所学知识的好时机。
项目#
在 LLVM 中,我们使用yaml2obj
手动制作各种格式的简单二进制文件,诸如 ELF、Mach-O、COFF 等。我的项目是为yaml2obj
添加 DWARF 支持,希望能让人们更容易地手动制作这些二进制文件中的调试部分。该项目由 James Henderson 监督。
进展#
我们已经按照计划将现有的 DWARF 实现移植到yaml2elf
。人们能够在较低级别上手动制作 DWARF 部分。我必须承认,目前 DWARF 部分的实现使用起来很困难,因为我们必须指定几乎每个字段,例如长度、版本、相关 DWARF 部分的地址或偏移量等。这是因为这些部分在当前实现中是孤立的,而 DWARFYAML 缺乏使这些部分正确相互链接的策略。这正是我们要解决的问题,我相信未来会有所改善。我们还有一个电子表格来记录与预期时间表的进展。
实现状态#
支持的 DWARF 部分的语法和已知问题如下所示。我不打算解决所有问题,因为某些 DWARF 部分在 DWARFv5 规范中已被弃用且很少使用。
注意:用 "[[]]" 引起来的字段是可选的。
语法 | 已知问题 / 可能的改进 |
---|---|
* 不支持发出多个缩写表。D83116 | |
* yaml2macho 不支持发出.debug_addr 部分。* dwarf2yaml 不支持解析.debug_addr 部分。 | |
* 长度 、AddrSize 和SegSize 字段应为可选。* 将 CuOffset 重命名为DebugInfoOffset 。* 将 AddrSize 重命名为AddressSize 。* 将 SegSize 重命名为SegmentSelectorSize 。 | |
* 将AbbrOffset 重命名为DebugAbbrevOffset 。* 将 AddrSize 重命名为AddressSize 。* 将 AbbrCode 重命名为AbbrevCode 或代码 。 | |
* DWARFv5 .debug_line 部分尚未测试。 | |
* 不支持发出多个 pub 表。 * 用 格式 和长度 替换长度 。 | |
成就#
我很高兴我大致能够达到第一阶段的目标。在第一个编码周期中,我了解了调试信息在目标文件中如何以较低级别表示,以及如何处理 LLVM 库中的错误。我还能够深入研究一些相关的核心库,如 DebugInfo、CodeGen 等。
需要改进的领域#
然而,仍然有一些领域我做得不好。当我在将 DWARF 支持移植到yaml2elf
时,我发现某些 DWARF 部分格式不佳,例如.debug_pub*
部分不支持发出多个 pub 表,.debug_abbrev
部分不支持发出多个缩写表,.debug_pub*
和.debug_abbrev
部分缺少终止条目等。我曾经先将它们移植到yaml2elf
,然后尝试修复问题。然而,这并不是正确的方法!我应该先修复问题,然后再将部分移植到yaml2elf
,这样我就不必在许多地方更新测试用例,这可以防止格式不良的测试用例到处传播。
此外,如果我让elf2yaml
支持将 DWARF 部分转换回 YAML,我的生活会更轻松。在将某些部分移植到yaml2elf
后,我意识到我们有一个能够将 DWARF 部分转换回去的工具是很好的,这样我就不必手动制作太多部分。
致谢#
我想对 James Henderson 在这个项目中对我的指导表示衷心的感谢,并感谢大家对我的补丁进行审查并在我的提案中提供了许多有用的建议!
已接受的补丁#
以防这些补丁对评估有用。
D82435 [DWARFYAML][debug_gnu_*] 添加缺失的上下文
D82933 [DWARFYAML][debug_abbrev] 为终止缩写发出 0 字节。
D82622 [DWARFYAML][debug_info] 用 ' 格式 ' 和' 长度 ' 替换 'InitialLength'。
D82367 [ObjectYAML][ELF] 添加对发出.debug_gnu_pubnames/pubtypes 部分的支持。
D82630 [ObjectYAML][DWARF] 当 YAMLParser 失败时收集诊断消息。
D82296 [ObjectYAML][ELF] 添加对发出.debug_pubnames 部分的支持。
D82621 [DWARFYAML][debug_info] 教会 yaml2obj 发出正确的 DWARF64 单元头。
D82351 [ObjectYAML][DWARF] 删除未使用的上下文。NFC。
D82347 [ObjectYAML][ELF] 添加对发出.debug_pubtypes 部分的支持。
D82275 [DWARFYAML][debug_info] 添加对错误处理的支持。
D82173 [DWARFYAML][debug_info] 使用 'AbbrCode' 索引缩写。
D82139 [DWARFYAML][debug_info] 修复数组索引越界错误。
D82073 [ObjectYAML][ELF] 添加对发出.debug_info 部分的支持。
D81826 [DWARFYAML][debug_abbrev] 使缩写代码可选。
D81820 [ObjectYAML][ELF] 添加对发出.debug_abbrev 部分的支持。
D81915 [ObjectYAML][DWARF] 让 writeVariableSizedInteger () 返回错误。
D81541 [ObjectYAML][DWARF] 实现.debug_addr 部分。
D81709 [ObjectYAML][DWARF] 让目标地址大小从 FileHeader 推断。
D81529 [ObjectYAML][test] 使用单个测试文件测试空的 'DWARF' 条目。
D80722 [ObjectYAML][DWARF] 使 'PubSection' 可选。
D81220 [DWARFYAML][debug_ranges] 使 "Offset" 字段可选。
D81528 [DWARFYAML] 添加对发出 DWARF64.debug_aranges 部分的支持。
D81450 [ObjectYAML][ELF] 添加对发出.debug_line 部分的支持。
D81357 [DWARFYAML][debug_ranges] 为无效偏移发出错误消息。
D81356 [ObjectYAML] 添加对 DWARFYAML 中的错误处理的支持。NFC。
D80203 [ObjectYAML][DWARF] 在 ELFYAML 中添加 DWARF 条目。
D80862 [ObjectYAML][test] 解决 D80203 中的评论。
D81217 [ObjectYAML][DWARF] 支持在 ELFYAML 中发出.debug_ranges 部分。
D81063 [DWARFYAML][debug_aranges] 用格式和长度替换 InitialLength。
D81051 [ObjectYAML][ELF] 让 DWARF 部分的字节序从 FileHeader 推断。
D80972 [ObjectYAML][DWARF] 支持在 ELFYAML 中发出.debug_aranges 部分。
D80535 [ObjectYAML][MachO] 在 MachOEmitter 中添加错误处理。