GSoC'20 によって私の提案が受け入れられてから 1 ヶ月が経ちました。私は多くのことを学び、素晴らしい時間を過ごしました。また、私たちは目標に向けていくつかの進展を遂げました。したがって、最初のコーディング期間に私が何をしたのか、何を学んだのかを振り返る良い時期です。
プロジェクト#
LLVM では、yaml2obj
を使用して、ELF、Mach-O、COFF などの YAML 形式のさまざまなフォーマットのシンプルなバイナリを手作りします。私のプロジェクトは、yaml2obj
に DWARF サポートを追加することで、これにより人々がそのようなバイナリのデバッグセクションを手作りしやすくなることを期待しています。このプロジェクトは James Henderson によって監督されています。
進捗#
私たちはすでに計画通りに既存の DWARF 実装をyaml2elf
に移植しました。人々は低レベルで DWARF セクションを手作りできるようになっています。現在の DWARF セクションの実装は、これらのセクションのほぼすべてのフィールドを指定する必要があるため、使いにくいことを認めざるを得ません。たとえば、長さ、バージョン、関連する DWARF セクションのアドレスまたはオフセットなどです。これは、現在の実装ではこれらのセクションが孤立しており、DWARFYAML にはこれらのセクションを適切に相互リンクさせる戦略が欠けているためです。これが私たちが対処しようとしていることであり、将来的には改善されると信じています。また、進捗を期待されるタイムラインに対して記録するためのスプレッドシートもあります。
実装状況#
サポートされている 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 セクションはテストされていません。 | |
* 複数の公開テーブルを出力することをサポートしていません。 * Length をFormat とLength に置き換えるべきです。 | |
達成事項#
私は、最初の期間の目標を大まかに達成できたことを非常に嬉しく思っています。最初のコーディング期間中、私はオブジェクトファイル内でデバッグ情報がどのように表現されているか、LLVM ライブラリでのエラー処理の方法について学びました。また、DebugInfo、CodeGen などの関連するコアライブラリにも掘り下げていくことができました。
改善が必要な分野#
しかし、私がうまくできなかった分野もいくつかあります。DWARF サポートをyaml2elf
に移植しているとき、いくつかの DWARF セクションが適切にフォーマットされていないことに気付きました。たとえば、.debug_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' を 'Format' と 'Length' に置き換える。
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 を Format と Length に置き換える。
D81051 [ObjectYAML][ELF] DWARF セクションのエンディアンネスを FileHeader から推測できるようにする。
D80972 [ObjectYAML][DWARF] ELFYAML で.debug_aranges セクションを出力するサポートを追加。
D80535 [ObjectYAML][MachO] MachOEmitter にエラーハンドリングを追加。