私の GSoC が終了し、これは過去 3 ヶ月間の私の作業の報告です。私のプロジェクトは、yaml2obj
に DWARF サポートを追加すること、特にyaml2elf
に焦点を当てています。元の提案はこちらです。
実装状況#
メンターの James や他のコミュニティメンバーの助けを借りて、私は元の提案のほとんどのマイルストーンを達成することができました。現在、ツールの使いやすさは大幅に改善されました。いくつかの優れた機能は以下に示されています。
* DWARF セクションのInitialLength
フィールドはFormat
とLength
に置き換えられました。 最初は、ツールに適切な DWARF64 または DWARF32 セクションを出力させるためにInitialLength
フィールドをハードコーディングする必要がありました。例えば、
## 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 ## 2番目の略語テーブルを参照します。
- ...
AbbrevTableID: 0 ## 1番目の略語テーブルを参照します。
* より多くの DWARF セクションがサポートされました。 debug_rnglists
、debug_loclists
、debug_addr
、およびdebug_str_offsets
セクションがyaml2obj
で新たにサポートされました。詳細については、D83624、D84234、D81541、およびD83853を確認してください!
* DWARF サポートがelf2yaml
に追加され、macho2yaml
で改善されました。 最初、macho2yaml
の出力はノイズが多かったです。DWARF セクションを 2 回ダンプし、1 回はSections:
エントリに、もう 1 回はDWARF:
エントリに出力しました。例えば、
## debug_strセクションの内容が2回ダンプされています!
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です。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 セクションを出力することをサポートします。
DWARF セクションをyaml2obj
に新たに導入:
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] InitialLength を Format と Length に置き換えます。
D81051 [ObjectYAML][ELF] DWARF セクションのエンディアンネスを FileHeader から推測できるようにします。
D86590 [DWARFYAML] unit_length と header_length フィールドをオプションにします。
D86537 [DWARFYAML] 'Attributes' フィールドをオプションにします。
D83116 [DWARFYAML] 異なる略語テーブルを参照するサポートを追加します。
D86194 [DWARFYAML] 複数の略語テーブルを出力することをサポートします。
D86192 [obj2yaml] .debug_pub * セクションダンパーをリファクタリングします。
D85880 [DWARFYAML] InitialLength を Format と Length に置き換えます。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] より安全性を高めるために virtual の代わりに override を使用します。
D83220 [DWARFYAML][unittest] parseDWARFYAML () をリファクタリングします。
D82435 [DWARFYAML][debug_gnu_*] 欠落しているコンテキストIsGNUStyle
を追加します。NFC。
D82933 [DWARFYAML][debug_abbrev] 終了略語のために 0 バイトを出力します。
D82622 [DWARFYAML][debug_info] 'InitialLength' を 'Format' と 'Length' に置き換えます。
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 () が Error を返すようにします。
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 のコメントに対処します。