Linuxで実行可能ファイルを実行するとどうなるかについての優れたドキュメントはありますか?例:起動する./a.out
と、おそらくブートローダーアセンブリが実行され(cランタイムが付属しますか?)、プログラムで開始シンボルが検出され、動的な再配置が行われ、最後に。が呼び出されますmain
。
上記が正しくないことは知っていますが、このプロセスがどのように発生するかについての詳細なドキュメントを探しています。説明していただけますか、それともリンクや本を指摘していただけますか?
Linuxで実行可能ファイルを実行するとどうなるかについての優れたドキュメントはありますか?例:起動する./a.out
と、おそらくブートローダーアセンブリが実行され(cランタイムが付属しますか?)、プログラムで開始シンボルが検出され、動的な再配置が行われ、最後に。が呼び出されますmain
。
上記が正しくないことは知っていますが、このプロセスがどのように発生するかについての詳細なドキュメントを探しています。説明していただけますか、それともリンクや本を指摘していただけますか?
動的リンクプログラムの場合、カーネルはPT_INTERP
ELFファイル内のヘッダーを検出し、最初に動的リンカー(/lib/ld-linux.so.2
または同様のもの)をmmapし、動的リンカーe_entry
のメインELFヘッダーからのアドレスで実行を開始します。スタックの初期状態には、ダイナミックリンカがメインプログラムバイナリ(すでにメモリ内にある)を見つけるために必要な情報が含まれています。これを読み、ロードする必要のあるすべての追加ライブラリを見つけ、それらをロードし、再配置を実行しe_entry
、メインプログラムのアドレスにジャンプする責任があります。
静的にリンクされたプログラムの場合、カーネルはe_entry
メインプログラムのELFヘッダーのアドレスを直接使用します。
いずれの場合も、メインプログラムは、従来から呼び出されているアセンブリで記述されたルーチンで始まります(ただし、そのアドレスがELFヘッダー_start
のフィールドにある限り、名前は重要ではありません)。e_entry
初期スタックの内容を使用して、、、などを決定しargc
、適切な実装内部関数(通常はCで記述)を呼び出してグローバルコンストラクター(存在する場合)を実行し、へのエントリの前に必要なlibc初期化を実行します。これは通常、への呼び出しまたは同等のもので終了します。argv
environ
main
exit(main(argc, argv));
「リンカーとローダー」という本には、ロードプロセスに関する詳細な説明が記載されています。多分それはあなたに問題のいくつかの助けを与えることができます。