2017-09-05 2 views
0

コマンドライン引数がどのように詳細に機能するかを理解しようとしています。コマンドライン引数は "2回渡される"でしょうか?

これは私が起こる考えるものです:

あなたがCで main()機能が含まれているソースコードをコンパイルすると、生成されたオブジェクトファイルは、CRTにリンクされます
  • 、およびプログラムのエントリポイント_start()関数(CRTに存在する)になり、_start()main()を呼び出します。

  • はあなたには、いくつかのコマンドライン引数を、あなたのプログラムを実行し、それを通過したときに今、コマンドライン引数は_start()関数に渡されます、その後、_start()main()にコマンドライン引数を再通過します。

正しいですか?

+1

"になる部分に分割する必要があります" ...プログラムのエントリポイントは "main"関数になります。それ以外のものはあなたのCプログラムとは無関係です。もっと深くしたいのであれば、これはCに関連するのではなく、あなたのプラットフォームだけに関係します。 Linuxを使って、crtとローダーのソースコードを読んで、シンプルなプログラムをシングルステップ実行します。これをすべてここで説明するには、はるかに広すぎます。 – Olaf

+0

引数の配列を表すポインタと引数countが渡されます。引数自体はランタイムによって処理されています。 – jxh

+0

コマンドラインを解釈するシェルは、パラメータを解析し、引数の配列に値を設定します。その後、countとポインタをコンパイラ固有のメソッド(メインに呼び出す前にスタックに置くか、レジスタにこれらの値を設定する可能性が高い)を介してmainに渡します。 – blackghost

答えて

4

正しいですか?

はいおよびno:

_start()関数はC関数が、アセンブラ関数ではありません。これは、CPUがCプログラムで必要とされる「状態」にないため、_start()関数はCコードを実行するためにCPUを設定する必要があるためです。

_start()が呼び出されたときのCプログラムの "状態"とCPUの "状態"の違いは、引数(ここではコマンドライン引数)が格納されていることです。

Linux(少なくとも32ビット - 私は64ビットについてはわかりません)では、後でargvを表す配列を実際に持っています。 _start()は、argvの位置を計算し、計算された値をmain()に渡す必要があります。

Windowsでは、コマンドライン全体を1つの文字列(const char *)へのポインタとして返す関数があります。 _start()関数はその関数を呼び出して、文字列を後でargv ...

+0

x86-64 Linuxは基本的にi386と同じですが、これはプロセス入力時のスタックレイアウトです。しかし、argcとポインタは64ビット幅です。 ABIは詳細を文書化する。 https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI –

関連する問題