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