_startは私のプログラムの主な機能と他の基本設定機能を呼び出しますか? [閉鎖]

_startは私のプログラムの主な機能と他の基本設定機能を呼び出しますか? [閉鎖]

ローダーのしくみを説明する教科書を読んでいます。

ローダが実行されると、実行可能オブジェクトファイルのブロックがコードとデータセグメントにコピーされます。次に、ローダーは常に関数のアドレスであるプログラムのエントリポイントにジャンプします。 _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. 一度objdumpプログラムのアセンブリコードを確認してみると、_start以下のような呼び出ししかないことがわかりました。__libc_start_main

    ここに画像の説明を入力してください。

    call __setup_for_cなどの他の機能はどうですか_main?特に、私のプログラムの主な機能がどのように呼び出されるのかわかりません。もしそうなら、実行フローの疑似コードは正しいですか?

  2. __libc_start_main標準ライブラリを設定するとはどういう意味ですか?なぜ標準ライブラリを設定するのですか?標準ライブラリは、プログラムがロードされたときに動的リンカーを介してのみリンクする必要はありませんか?

答え1

  1. _dl_start_userリンクされた回答で説明されている他の関数呼び出しは、「作成者」()またはを使用してGNU Cライブラリで発生する必要がある実際の実装の詳細の概要を提供します__libc_start_main。見えませんか?__libc_start_mainmainと言う分解すると、対応するアドレスが渡されます(参照leacallq__libc_start_mainまた、プログラムが終了して返却されない責任もあります。関数が返されると、プログラムは中断されますhltcallq

  2. 今日、ライブラリには多くの設定が必要です。

    • 一部独自の再配置
    • スレッドローカルストレージの設定
    • 並列スレッドの設定
    • デストラクタ登録
    • vDSO設定(Linux)
    • ctypeの初期化
    • プログラム名、引数、環境をさまざまなライブラリ変数にコピーする

    など。 x86-64に関する情報を参照してください。sysdeps/x86_64/start.Sそして一般csu/libc-start.ccsu/init-first.cmisc/init-misc.c他のものの間。

関連情報