Linuxで実行可能なELFファイルは何ですか?
- 静的リンカー
- 動的リンカー
- 荷物を載せる人
- 動的ローダー?
これらのうち何と呼ばれますか?
- 渡す
execve()
- 合格
dlopen()
?
execve()
実行可能ファイル呼び出しdlopen()
の鶏と卵の問題を解決するためにORからどのように呼び出すことができますか?execve()
dlopen()
ありがとうございます。
ベストアンサー1
使用していると思います。ジェフ・ダアシの定義:
- 静的リンクにはコンパイル時にシンボルをチェックするアクションが含まれ、動的リンクには実行時にシンボルをチェックするアクションが含まれます。
- 静的ロードにはロード時に実行可能ファイルとライブラリマッピングが含まれ、ダイナミックロードにはプロセスの開始後にライブラリマッピングが含まれます。
すべてを分離しようとすることは実際には意味がありません。代わりに、次の機能ペアを考慮する必要があります。
- 静的ロード、静的リンク:リンカーは
/usr/bin/ld
通常静的ライブラリ(.a
)で使用されます。ローダーはカーネルです。 - 静的ロード、ダイナミックリンク:リンカは
/usr/bin/ld
再利用されますが、共有ライブラリ(.so
)では、ローダはバイナリファイルのインタプリタです。例えば/lib64/ld-linux-x86-64.so.2
(/lib/x86_64-linux-gnu/ld-2.24.so
現在マップされています)64ビットx86のDebian 9では、カーネルによって独自にロードされ、デフォルトの実行可能ファイルもロードされます。 - 動的ロード、静的リンク:私が知っている限り、これはLinuxでは使用されていません。
- 動的ロード、動的リンク:ローダーはライブラリです。たとえば、
libdl
リンカはライブラリと呼び出しプログラムに分けられますlibdl
。
おそらくこの最後の点についてはもう少し説明が必要でしょう。プログラムがlibdl
ロード・ライブラリーを使用するときは、以下を呼び出します。dlopen
、名前付きライブラリとプロセスでまだ利用できないすべての依存関係をロードし、名前付きライブラリをその依存関係に関連付けます。そのため、libdl
ロード(必要なライブラリ)とリンク(呼び出し元プログラムではなくライブラリのみ)が行われます。呼び出しプログラムが名前付きライブラリーのシンボルを使用する必要がある場合は、次のように呼び出します。dlsym
要求されたシンボルが見つかった場合は、そのシンボルのアドレスを返します。したがって、呼び出しプログラムは部分的な接続を実行します。
execve
それとも、鶏が最初か卵が最初かという問題の余地はありませんdlopen
。プログラムは、(ほとんどのプログラムが実際に使用するラッパーが含まれています)と記号(厳密には前述のラッパー)へのexecve
適切な参照を使用してコンパイルされます。これらの参照は、コンパイル時(静的リンカーの場合)またはロード時に(動的リンカーの場合)解決されます。その後、シンボルを使用してプログラムを呼び出すことができます。使用するプログラムは適切に参照されます。編集のために引用しました。動的リンカー自体は静的バイナリなので、カーネルは動的リンカーの助けを借りずにそれをロードできます。このトピックの詳細については、以下で確認できます。libc
execve
execve
dlopen
dlopen
libdl
dlopen
プログラムの仕組みそしてプログラムの実行方法:ELFバイナリ。
(すべての動的ケースでは、リンク、遅延バインディングが有効になっていると、接続はロード時にはすぐに発生する可能性があります。 )