我的 GSoC 项目结束了,这是我在过去三个月工作的一份报告。我的项目是为yaml2obj
添加 DWARF 支持,特别是yaml2elf
。原始提案在这里。
实施状态#
在我的导师 James 和其他社区成员的帮助下,我能够完成原始提案中的大部分里程碑。现在,该工具的可用性有了很大改善。以下是一些突出的功能。
* DWARF 节的InitialLength
字段被替换为Format
和Length
。 起初,我们必须硬编码InitialLength
字段以指示工具发出适当的 DWARF64 或 DWARF32 节,例如:
## DWARF32节。
InitialLength:
TotalLength32: 0x1234
## DWARF64节。
InitialLength:
TotalLength32: 0xffffffff
TotalLength64: 0x1234
现在,yaml2obj
默认发出 DWARF32 节,Length
字段可以省略,yaml2obj
会为我们计算它(解决此问题的补丁:D82622, D85880, D81063, D84008, D86590, D84911)。
## DWARF32节。
## Format和Length字段可以省略。
## 我们不需要关心它们。
## DWARF64节。
Format: DWARF64 ## 我们只需要指定Format字段。
* yaml2obj
支持发出多个缩写表。 yaml2obj
之前只支持发出一个缩写表,多个编译单元必须共享同一个缩写表,在D86194和D83116之前。现在,yaml2obj
能够发出多个缩写表,编译单元可以链接到其中的任何一个。我们为缩写表添加了一个可选字段ID
,为编译单元添加了一个可选字段AbbrevTableID
。编译单元可以使用AbbrevTableID
链接具有相同ID
的缩写表。然而,编译单元的AbbrOffset
字段对应于debug_abbrev_offset
字段仍然需要指定。如果未来D86614能够被接受,我们就不需要再计算和指定它了!
debug_abbrev:
- ID: 0
Table:
...
- ID: 1
Table:
...
debug_info:
- ...
AbbrevTableID: 1 ## 引用第二个缩写表。
- ...
AbbrevTableID: 0 ## 引用第一个缩写表。
* 支持更多 DWARF 节。 yaml2obj
新支持debug_rnglists
、debug_loclists
、debug_addr
和debug_str_offsets
节。有关更多信息,请查看D83624、D84234、D81541和D83853!
* DWARF 支持已添加到elf2yaml
并在macho2yaml
中改进。 起初,macho2yaml
的输出很嘈杂。它将 DWARF 节输出两次,一次在Sections:
条目中,一次在DWARF:
条目中,例如:
## debug_str节的内容被输出两次!
Sections:
- sectname: __debug_str
...
content: 6D61696E00 ## "main\0"
DWARF:
debug_str:
- main
在D85506之后,如果 DWARF 解析器无法将 DWARF 节解析到DWARF:
条目中,obj2yaml
将以原始内容节的形式输出它们,否则,它们将在DWARF:
条目中作为结构化 DWARF 节呈现。此外,D85094为elf2yaml
添加了 DWARF 支持。尽管它仅支持输出debug_aranges
节,但我们可以在未来轻松扩展它。
未完成的任务#
* 允许用户以高级别描述 DIE。 在我的原始提案中,我们计划使yaml2obj
支持以高级别描述 DIE。然而,yaml2obj
当时不支持发出多个缩写表,我花了一些时间使其能够发出多个缩写表并链接编译单元。我不会离开社区,我会在未来改进它。
我在 Phabricator 上的用户名是@Higuoxing。如果您在编写 DWARF 测试用例时遇到困难或发现错误,请随时联系我。我很乐意提供帮助!
致谢#
我想对 @jhenderson(James Henderson)在这个项目中指导我表示衷心的感谢。此外,我还要感谢 @grimar(George Rimar)、@MaskRay(Fangrui Song)、@labath(Pavel Labath)、@dblaikie(David Blaikie)、@aprantl(Adrian Prantl)和 @probinson(Paul Robinson)对我的补丁进行审查,耐心回答我的问题并对我的提案留下评论!
提议的变更(仅列出已接受和进行中的变更)#
进行中:
D86614 [DWARFYAML] 使 debug_abbrev_offset 字段可选。
D86545 [DWARFYAML] 新缩写表中的缩写代码应从 1 开始(默认)。
D85289 [DWARFYAML][debug_info] 重命名一些映射键。NFC。
将现有的 DWARF 支持移植到yaml2elf
:
D80203 [ObjectYAML][DWARF] 在 ELFYAML 中添加 DWARF 条目。
D80972 [ObjectYAML][DWARF] 支持在 ELFYAML 中发出.debug_aranges 节。
D81217 [ObjectYAML][DWARF] 支持在 ELFYAML 中发出.debug_ranges 节。
D81450 [ObjectYAML][ELF] 添加支持发出.debug_line 节。
D81820 [ObjectYAML][ELF] 添加支持发出.debug_abbrev 节。
D82073 [ObjectYAML][ELF] 添加支持发出.debug_info 节。
D82347 [ObjectYAML][ELF] 添加支持发出.debug_pubtypes 节。
D82367 [ObjectYAML][ELF] 添加支持发出.debug_gnu_pubnames/pubtypes 节。
D82296 [ObjectYAML][ELF] 添加支持发出.debug_pubnames 节。
向yaml2obj
引入新的 DWARF 节:
D81541 [ObjectYAML][DWARF] 实现.debug_addr 节。
D83624 [DWARFYAML] 实现.debug_rnglists 节。
D83853 [DWARFYAML] 实现.debug_str_offsets 节。
D84234 [DWARFYAML] 实现.debug_loclists 节。
为 obj2yaml 添加 DWARF 支持:
D85094 [obj2yaml] 添加支持发出.debug_aranges 节。
重构工作(改进错误处理,使 YAML 字段可选,添加 DWARF64 支持等):
D80535 [ObjectYAML][MachO] 在 MachOEmitter 中添加错误处理。
D80861 [ObjectYAML][DWARF] 让dumpPubSection
返回DWARFYAML::PubSection
。
D81063 [DWARFYAML][debug_aranges] 用 Format 和 Length 替换 InitialLength。
D81051 [ObjectYAML][ELF] 让 DWARF 节的字节序从 FileHeader 推断。
D86590 [DWARFYAML] 使 unit_length 和 header_length 字段可选。
D86537 [DWARFYAML] 使 'Attributes' 字段可选。
D83116 [DWARFYAML] 添加支持引用不同的缩写表。
D86194 [DWARFYAML] 添加支持发出多个缩写表。
D86192 [obj2yaml] 重构.debug_pub * 节的转储器。
D85880 [DWARFYAML] 用 Format 和 Length 替换 InitialLength。NFC。
D85805 [DWARFYAML] 使编译单元的地址大小可选。
D85821 [MachOYAML] 简化节数据发出函数。NFC。
D85707 [DWARFYAML] 让行表的地址大小从目标文件推断。
D85506 [macho2yaml] 重构 DWARF 节转储器。
D85496 [macho2yaml] 删除未使用的函数。NFC。
D85397 [DWARFYAML][debug_info] 使 'Values' 字段可选。
D85405 [obj2yaml] 测试转储空的.debug_aranges 节。
D84496 [DWARFYAML] 用 'Format'、'Version' 等替换 'FormParams'。NFC。
D85296 [DWARFYAML][debug_info] 从 DWARFYAML::Unit 中提取 dwarf::FormParams。
D85179 [DebugInfo][unittest] 使用 YAML 生成.debug_loclists 节。
D85006 [DWARFYAML] 当 OffsetEntryCount 为 0 时应省略偏移量。
D84921 [DWARFYAML] 使 debug_aranges 条目可选。
D84952 [DWARFYAML] 添加辅助函数 getDWARFEmitterByName ()。NFC。
D85003 [DWARFYAML] 添加 emitDebug [GNU] Pub [names/types] 函数。NFC。
D84911 [DWARFYAML] 使地址范围表的 'Length' 字段可选。
D84907 [DWARFYAML] 使 'AddressSize'、'SegmentSelectorSize' 字段可选。
D84624 [DWARFYAML] 将 checkListEntryOperands () 重命名为 checkOperandCount ()。NFC。
D84618 [DWARFYAML] 添加支持发出自定义范围列表内容。
D83282 [DWARFYAML] 重构:将成员函数提取到 DWARFYAMLUtils.cpp。
D84383 [DWARFYAML] 提取 rnglist 和 loclist 表的公共辅助函数。NFC。
D84008 [DWARFYAML] 重构 emitDebugInfo () 以使长度被推断。
D84239 [DWARFYAML] 重构范围列表表以保存更多数据结构。
D83749 [DWARFYAML] 添加支持发出 strx、addrx 等的值形式。
D83452 [DWARFYAML] 使用 override 而不是 virtual 以提高安全性。
D83220 [DWARFYAML][unittest] 重构 parseDWARFYAML ()。
D82435 [DWARFYAML][debug_gnu_*] 添加缺失的上下文IsGNUStyle
。NFC。
D82933 [DWARFYAML][debug_abbrev] 为终止缩写发出 0 字节。
D82622 [DWARFYAML][debug_info] 用 'Format' 和 'Length' 替换 'InitialLength'。
D82630 [ObjectYAML][DWARF] 当 YAMLParser 失败时收集诊断消息。
D82351 [ObjectYAML][DWARF] 删除未使用的上下文。NFC。
D82275 [DWARFYAML][debug_info] 添加支持错误处理。
D82173 [DWARFYAML][debug_info] 使用 'AbbrCode' 索引缩写。
D81826 [DWARFYAML][debug_abbrev] 使缩写代码可选。
D81915 [ObjectYAML][DWARF] 让 writeVariableSizedInteger () 返回错误。
D81709 [ObjectYAML][DWARF] 让目标地址大小从 FileHeader 推断。
D81529 [ObjectYAML][test] 使用单个测试文件测试空的 'DWARF' 条目。
D80722 [ObjectYAML][DWARF] 使PubSection
可选。
D81220 [DWARFYAML][debug_ranges] 使 "Offset" 字段可选。
D81528 [DWARFYAML] 添加支持发出 DWARF64 .debug_aranges 节。
D81357 [DWARFYAML][debug_ranges] 为无效偏移发出错误消息。
D81356 [ObjectYAML] 添加支持 DWARFYAML 中的错误处理。NFC。
错误修复
D85717 [DWARFYAML] 教会 yaml2obj 发出正确的行表程序。
D85180 [YAMLTraits] 修复后跟注释的映射值。
D84640 [llvm-readelf] 修复在 '--hex-dump' 中发出不正确的空格数量。
D82621 [DWARFYAML][debug_info] 教会 yaml2obj 发出正确的 DWARF64 单元头。
D82139 [DWARFYAML][debug_info] 修复数组索引越界错误。
D80862 [ObjectYAML][test] 解决 D80203 中的注释。