17

別のプログラムから関数を呼び出す必要があります。他のプログラムがライブラリの場合、dlopen と dlsym を使用して関数のハンドルを取得できます。残念ながら、もう一方のプログラムは Unix Executable であり、ライブラリとしてビルドすることはできません。実行可能ファイルで dlopen() を試行すると、次のエラー メッセージが表示されます。

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

dlopen は実行可能ファイルではなくライブラリで使用するためのものであるため、これは驚くべきことではありません。dlopen と dlsym を実行可能ファイルで動作させる方法はありますか? そうでない場合、同じことを達成する別の方法はありますか?

4

4 に答える 4

10

実行可能ファイルをライブラリとして開くことはできません。brk実行可能ファイルのエントリ ポイントは、C ライブラリを再初期化し、ポインタを引き継ごうとします。これにより、malloc ヒープが破損します。さらに、実行可能ファイルは再配置なしで固定アドレスにマップされる可能性が高く、このアドレスが既にロードされているものと重複する場合、その理由からもマップできません。

他のプログラムをライブラリにリファクタリングするか、RPC インターフェイスを他のプログラムに追加する必要があります。

これは必ずしも PIE 実行可能ファイルには適用されないことに注意してください。ただし、実行可能ファイルがdlopen()ed 用に特別に設計されていない限り、これは安全でmain()はありません。実行されないため、実行された初期化は行われmain()ません。

于 2011-07-07T22:06:30.563 に答える
9

一部の ELF システム (特に Linux) では、dlopen()実行可能ファイルを PIE できます。GCC を使用する場合は、実行可能ファイルを-fpieor-fPIEでコンパイルしてリンクし、 or-pieを使用して適切なシンボルをエクスポートします(この他の SO 回答で詳しく説明されています。--dynamic-list-rdynamic

于 2011-07-07T23:31:30.917 に答える
0

dlopen を介して実行可能ファイルをロードする機能を追加するには、拒否された glibc RFE (Request For Enhancement) として登録されます。RFE の詳細と、いくつかの特殊なケースに対する考えられるアプローチについては、次の Web サイトを参照してください。

[http://sourceware.org/bugzilla/show_bug.cgi?id=11754][1]

PIE を除外すると、そのような機能を実装するために舞台裏で多くの問題が発生します。

于 2013-07-31T15:27:39.590 に答える