1

静的にリンクされた(動的にリンクされていない)再配置不可能なバイナリ(つまり、-pie、-fPIEなどで構築されていない)をロードできる基本的なユーザー空間ELFローダーを作成しようとしています。今のところ x86 CPU で動作するはずです。

ユーザー空間でCのELFファイルをロードするコードに従いましたが、実行可能ファイルが再配置可能な場合はうまく機能しますが、プログラムが間違った仮想メモリ範囲にロードされて即座にクラッシュするため、そうでない場合は予想通り完全に失敗します。

しかし、予想される仮想オフセットでプログラムをロードするように変更しようとしましたが (phdr.p_vaddr を使用)、複雑な問題に遭遇しました: 私のローダーは既にその仮想メモリ範囲を使用しています! 私はそれをmmapすることはできません。ましてや、それに何かを書き込むことはできません。ローダー自体のコードを完了する前に上書きせずに、再配置不可能なバイナリをローダーのアドレス空間にロードできるようにするには、どうすればよいですか? ローダーを完全に異なる仮想メモリ範囲から実行する必要がありますか。おそらく、リンカを取得して、再配置不可能なバイナリの通常の仮想メモリ範囲よりもはるかに上にリンクさせる必要がありますか (私の場合は 0x400000 で始まります) またはそれには何かトリックがありますか?

ELF のドキュメント (ちなみにここでは ELF64 を使用していますが、ELF32 と ELF64 は非常に似ていると思います) と Web 上の多くのドキュメントを読みましたが、まだ理解できません。

ELF ローダーがこの複雑な問題をどのように処理するかを誰か説明できますか? ありがとう!

4

1 に答える 1