Linux:ELFオブジェクトヘッダーはどこにあり、どのように使用しますか?

Linux:ELFオブジェクトヘッダーはどこにあり、どのように使用しますか?

シェルでローダーがfork()、exec()シーケンスELFを読み取って使用する場所を知っている人はいますか? Linuxを例として使用できます。

私がこの質問をする理由は、私が理解したところによると、ELFにはメモリセグメントとレイアウトに関する情報があるからです。このELF情報がどこでどのように利用されるのか疑問に思います。

EXECVE(2) のアップデート:

実行可能ファイルが共有ライブラリのルートを含むa.out動的にリンクされたバイナリ実行可能ファイルである場合、実行の開始時にLinux動的リンカーld.so(8)が呼び出され、必要な共有オブジェクトがメモリに配置され、実行可能ファイルが配置されます。彼らに。

実行可能ファイルが動的にリンクされたELF実行可能ファイルの場合、PT_INTERPセクションで指定されたインタプリタは必要な共有オブジェクトをロードするために使用されます。 glibcに関連付けられたバイナリの場合、このインタプリタは通常/lib/ld-linux.so.2です(ld-linux.so(8)を参照)。

LD.SO(8)では、私たちは次のことを知っています:

ld.soプログラムは、以前に使用されたバイナリ形式のa.outバイナリファイルを処理します。プログラムld-linux.so *(libc5の場合は/lib/ld-linux.so.1、glibc2の場合は/lib/ld-linux.so.2)は最新のELF形式のバイナリを処理します。

リンカーエディタがELFヘッダー、プログラムヘッダー、およびセクションヘッダー(表示されているように)の情報を使用して、プログラムファイルの元のプログラムデータをプロセスのアドレス空間にコピーする方法に関する情報がまだ不足しています。このアドレス空間は、静的データとテキストセグメントで構成されます。次に、SPおよびPC呼び出しプログラムファイルのテキストエントリポイントを設定する作業があります。

私が理解したところ、exec()はプログラムの中断(プロセスに割り当てられたメモリの最上位)を静的データとテキストセグメントのサイズの合計に設定し、そのセグメントをプログラムの中断の下のプログラムアドレス空間にコピーします。

非常に低い周波数 ありがとう

ベストアンサー1

おすすめ記事