自從我的提案被 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 部分。 | |
* Length 、AddrSize 和SegSize 字段應該是可選的。* 將 CuOffset 重命名為DebugInfoOffset 。* 將 AddrSize 重命名為AddressSize 。* 將 SegSize 重命名為SegmentSelectorSize 。 | |
* 將AbbrOffset 重命名為DebugAbbrevOffset 。* 將 AddrSize 重命名為AddressSize 。* 將 AbbrCode 重命名為AbbrevCode 或Code 。 | |
* 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 中添加錯誤處理。