ローダーのしくみを説明する教科書を読んでいます。
ローダが実行されると、実行可能オブジェクトファイルのブロックがコードとデータセグメントにコピーされます。次に、ローダーは常に関数のアドレスであるプログラムのエントリポイントにジャンプします。 _start
_start
関数はシステム起動関数を呼び出します。__libc_start_main
回答で判断するとこのスタックオーバーフローの質問、実行プロセスの次の疑似コードがあります。
_start:
call __setup_for_c ; set up C environment
call __libc_start_main ; set up standard library
call _main ; call your main
call __libc_stop_main ; tear down standard library
call __teardown_for_c ; tear down C environment
jmp __exit ; return to OS
私の質問は次のとおりです
答え1
_dl_start_user
リンクされた回答で説明されている他の関数呼び出しは、「作成者」()またはを使用してGNU Cライブラリで発生する必要がある実際の実装の詳細の概要を提供します__libc_start_main
。見えませんか?__libc_start_main
main
と言う分解すると、対応するアドレスが渡されます(参照lea
)callq
。__libc_start_main
また、プログラムが終了して返却されない責任もあります。関数が返されると、プログラムは中断されますhlt
。callq
今日、ライブラリには多くの設定が必要です。
- 一部独自の再配置
- スレッドローカルストレージの設定
- 並列スレッドの設定
- デストラクタ登録
- vDSO設定(Linux)
- ctypeの初期化
- プログラム名、引数、環境をさまざまなライブラリ変数にコピーする
など。 x86-64に関する情報を参照してください。
sysdeps/x86_64/start.S
そして一般csu/libc-start.c
、csu/init-first.c
とmisc/init-misc.c
他のものの間。