3

Linux プラットフォームでカスタム バイナリ形式の実行可能ファイル (私の場合は PE) を読み込んで実行するプロジェクトに取り組んでいます。最初に実行可能ファイルをロードし、次に実行可能ファイルの開始アドレスを呼び出して安全に終了する小さな ELF 共有ライブラリをロードすることで、これまでのところかなりうまくいきました。

ただし、いくつかの理由から、自分で ELF のロードを実行したくありません。まず、私が使用している共有ライブラリはアセンブリで書かれており ( libc. C を使用しているので、どのプラットフォームでもコンパイルできます。また、独自の単純化されたバージョンではなく、Linux のネイティブ ELF ローダーを使用する方が簡単で安全です。

インストール済みのカーネル モジュールである binfmt ハンドラーを使用して実行可能ファイルを読み込み、実行可能コードを上書きせずに共有ライブラリ (およびその依存関係) を同じアドレス空間に読み込むように Linux に指示する方法があるかどうか疑問に思っています。私は最初、uselibsyscall が役立つかもしれないと考えましたが、man ページの説明では、これが私の目的に役立つかどうかについて明確ではありません。

libc 4.4.4 以降では、ライブラリ "/lib/ld.so" のみがロードされるため、この動的ライブラリは必要な残りのライブラリをロードできます (再びこの呼び出しを使用)。これは libc5 の現状でもあります。

glibc2 はこの呼び出しを使用しません。

また、その使用例を見たことがなく、理解できないシステムコールの使用には常に警戒しています。

私が説明したことを達成する良い方法はありますか? Linux の既存の機能を使用して、(C で記述された) 共有ライブラリを既に実行可能コードが含まれているアドレス空間にロードできますか? もしそうなら、どこにロードされたかを知らずにそのライブラリを使用するにはどうすればよいですか?

4

1 に答える 1

10

binfmt_pe (私が作成) と呼ばれるこのようなプロジェクトが既にあります。これはカーネル モジュールであり、独自のリンカー (/lib/ld に似ています) があります。 ここでチェックしてください

モジュールとローダー/リンカーの作成に関する質問については、以下のリンクがあります。また、ELF および PE 実行可能ファイルに関する情報へのリンクも含めました。

これが役立つことを願っています。:)

Linux カーネル モジュールを作成するための役立つ情報

動的ロード/リンクに関する情報

ELF および PE 形式に関する情報

于 2013-01-03T05:09:49.210 に答える