3

再配置エントリと ELF セクション データがどのように関連しているか、およびそれらがすべてどのように処理および生成されるかを理解するのを手伝ってくれることを願っています。

ELF ファイルと関連する PLF ファイル (ビルド プロセスの初期段階で生成された部分的にリンクされたファイル) を取得し、そこからカスタムの再配置可能ファイルをビルドする、サポートされていない古いツールを使用しています。このファイルは、メモリの制約が厳しいプラットフォーム (PPC) で使用されます。これは、起動後にアンロードする初期化コードが大量に含まれていることを除けば、問題なく機能します。そのため、アンロードするためにすべての初期化コードをカスタム セクションに配置しましたが、残念ながら、ツールはカスタム セクションを適切に処理できず、rel ファイルは無効です。したがって、私の仕事は、カスタム セクションを含むこの再配置可能なファイルを正しく生成する新しいツールを作成することです。

私は、このツールと rel ファイルの生成については比較的長い道のりを歩んできましたが、現在、セクション データの処理方法や再配置エントリの作成方法などを理解しようとして行き詰まっています。したがって、このリバース エンジニアリング ビジネスはすべて私にとって初めてのことです (インターネットに感謝します!)。

Elf Sharpを見つけて、それを出発点として使用しました。ELF ファイルと PLF ファイルの両方を読み込んで、その内容を操作することができます。そこから、再配置ファイルのヘッダーと内容の大部分をリバース エンジニアリングしましたが、正確とはほど遠いものです。古いツールのバージョンのファイルと私のファイルを比較すると、一部のセクション データが修正されていることがわかりますが、私のファイルは PLF ファイルから直接セクション データを使用しており、プレーンです。つまり、コピーしたセクション データには大量の「48 00 00 01」が含まれていますが、これらはすべて古いツールによって何らかの方法で修正されています。それらのバイトの意味は何ですか? また、それらに対して何が行われていますか? また、再配置エントリを生成する必要がありますが、続行する方法がわかりません。

オンラインでエルフの再配置を処理する例をいくつか見つけました。ツールで同様のものを実行していますが、正確に何をすべきかはまだかなり不明です。私はすべての再配置タイプとそれらの公式 (4.12.5 章の章) の良いリソースを持っていますが、どのオフセット、セクション情報などを使用すべきかまだよくわかりません。

TL;DR

  • これらの再配置エントリで正確に何が起こっているか、すべてがどのように生成および処理され、プログラムの実行時にどのように使用されるかを視覚化するのを手伝ってもらえますか?

  • セクションデータの「48 00 00 01」という単語はすべてどうしたのでしょうか? それらは適切なシンボルで解決されたと思いますが、これはどのように行われたのですか? .rela 情報を使用していますか?

  • また、いつ PLF コンテンツを使用し、いつ ELF コンテンツを使用すればよいかわかりません。ロードアドレスとセグメント情報を取得するには ELF だけが必要だと思います。

  • (PPC で) 再配置フィックスアップを生成する場合、再配置タイプの式を正確に評価するにはどうすればよいですか? 私がオンラインで参照した例は、その点で直感的ではありません。私はオフセットと混同しています - あなたは Elf32_Rela から取得しますが、それはあなたが変更したものですか? そして、フィックスアップの結果を記録するために使用されるオフセットは何ですか? 加数とは正確には何ですか?私はこれほど啓発的なものをオンラインで見つけたことがありません。

  • 再配置修正の一部 (実際にはほとんど) は、複数の .debug_ *セクションまたは .bss のいずれかを指しています。.debug の修正をスキップする必要がありますか、それとも重要ですか? .bss は NoBits セクションなので、どのように処理すればよいですか? そして、実際に再配置エントリを生成することになると、それらがどのように構築されるかは理解できますが、実際にエントリを作成する背後には誰/何がありますか? つまり、ビルドする準備はできていますが、どこから始めればよいかわかりません。データをどこかで繰り返しますか??

  • 私が尋ねるべきであるが、まだ気づいていない他の質問はありますか? ;)

私の長々とした質問を読んでくれてありがとう!

4

1 に答える 1