Linuxボックスを使用しているときは、シェルとしてbashを使用します。今、私はbashがELFファイルの実行をどのように処理するかを疑問に思いました。つまり、。/ programと入力し、programがELFファイルの場合です。私はbash-4.3.tar.gzをgrepしました。ファイルがELFであるかどうかを確認するためのマジック番号パーサーのようなものも、exec()syscallも見つかりませんでした。
プロセスはどのように機能しますか? ELFの実行をbashがOSに渡す方法を教えてください。
BashはELFについて何も知りません。外部プログラムを実行するように要求したことを確認するだけなので、指定した名前をそのまま execve(2)
に渡します。実行可能ファイル形式、 Shebang行 、実行権限などの知識は、カーネルの syscall の背後にあります。
(他のシェルでも同じですが、代わりに exec(3)
ファミリーの別の関数を使用することもできます。)
Bash 4.3では、これはShell_execve()
関数の _execute_cmd.c
_ の5195行で発生します。
Linuxをソースコードレベルで理解したい場合は、 Research Unix V6またはV7 のコピーをダウンロードし、それを実行することをお勧めします最近のLinuxシステムにあるすべての複雑さではなく。 ライオンズブック はコードの良いガイドです。
V7は Bourne Shell がデビューした場所です。そのCソースコード全体は、Bash内のその1つのCファイルのサイズの半分を少し超えています。 V6の Thompson Shell は、元のBourne Shellのほぼ半分のサイズです。しかし、これらの単純なシェルはどちらもBashと同じ種類のことを、同じ理由で実行します。 (これは、Thompson Shellのexecv(2)
からのtexec()
呼び出しと、Bourne Shellの_service.c
_モジュールのexecve()
からのexecs()
呼び出しのようです。 。)