我的 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
的縮寫表。然而,對應於 debug_abbrev_offset
欄位的編譯單元的 AbbrOffset
欄位仍然需要指定。如果 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
區段,但我們未來可以輕鬆擴展它。
未完成的任務#
* 允許用戶以高級別描述 DIEs。 在我的原始提案中,我們計劃讓 yaml2obj
支持以高級別描述 DIEs。然而,當時 yaml2obj
不支持發出多個縮寫表,我花了一些時間使其能夠發出多個縮寫表並將編譯單元與它們鏈接。我不打算離開社區,未來我會改進它。
我在 Phabricator 上的用戶名是 @Higuoxing。如果您在編寫 YAML 中的 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] 修正後跟註釋的映射 <none> 值。
D84640 [llvm-readelf] 修正 '--hex-dump' 中發出不正確的空格數。
D82621 [DWARFYAML][debug_info] 教授 yaml2obj 發出正確的 DWARF64 單元標頭。
D82139 [DWARFYAML][debug_info] 修正數組索引超出範圍的錯誤。
D80862 [ObjectYAML][test] 解決 D80203 中的註釋。