Linux プラットフォームでカスタム バイナリ形式の実行可能ファイル (私の場合は PE) を読み込んで実行するプロジェクトに取り組んでいます。最初に実行可能ファイルをロードし、次に実行可能ファイルの開始アドレスを呼び出して安全に終了する小さな ELF 共有ライブラリをロードすることで、これまでのところかなりうまくいきました。
ただし、いくつかの理由から、自分で ELF のロードを実行したくありません。まず、私が使用している共有ライブラリはアセンブリで書かれており ( libc
. C を使用しているので、どのプラットフォームでもコンパイルできます。また、独自の単純化されたバージョンではなく、Linux のネイティブ ELF ローダーを使用する方が簡単で安全です。
インストール済みのカーネル モジュールである binfmt ハンドラーを使用して実行可能ファイルを読み込み、実行可能コードを上書きせずに共有ライブラリ (およびその依存関係) を同じアドレス空間に読み込むように Linux に指示する方法があるかどうか疑問に思っています。私は最初、uselib
syscall が役立つかもしれないと考えましたが、man ページの説明では、これが私の目的に役立つかどうかについて明確ではありません。
libc 4.4.4 以降では、ライブラリ "/lib/ld.so" のみがロードされるため、この動的ライブラリは必要な残りのライブラリをロードできます (再びこの呼び出しを使用)。これは libc5 の現状でもあります。
glibc2 はこの呼び出しを使用しません。
また、その使用例を見たことがなく、理解できないシステムコールの使用には常に警戒しています。
私が説明したことを達成する良い方法はありますか? Linux の既存の機能を使用して、(C で記述された) 共有ライブラリを既に実行可能コードが含まれているアドレス空間にロードできますか? もしそうなら、どこにロードされたかを知らずにそのライブラリを使用するにはどうすればよいですか?