Loading article…
crt0 ( c0とも呼ばれる)は、 Cプログラムにリンクされた一連の実行開始ルーチンでありプログラムのメイン関数を呼び出す前に必要な初期化処理を実行します。メイン関数が完了すると、制御はcrt0に戻り、crt0はライブラリ関数exit(0)を呼び出してプロセスを終了します。
Crt0 は通常、 crt0.oと呼ばれるオブジェクト ファイルの形をとり、多くの場合アセンブリ言語で記述され、リンカによってビルドされるすべての実行可能ファイルに自動的に含まれます。[ 1 ]
crt0には、ランタイム ライブラリの最も基本的な部分が含まれています。そのため、実際に実行される処理は、プログラムのコンパイラ、オペレーティングシステム、およびC 標準ライブラリの実装に依存します。[ 1 ]環境とツールチェーンによって要求される初期化処理に加えて、crt0 は、 C++グローバルコンストラクタやGCCの((constructor))属性を持つ C 関数を実行するなど、プログラマによって定義された追加の操作を実行できます。[ 2 ] [ 3 ]
「crt」は「Cランタイム」の略で、ゼロは「開始」を意味します。ただし、GCCを使用してプログラムをコンパイルする場合、C以外の言語にも使用されます。特別な使用シナリオ向けに、 crt0の代替バージョンが用意されています。たとえば、gprofでプロファイリングを有効にするには、プログラムをgcrt0でコンパイルする必要があります。[ 4 ]
この例は、実際のCランタイムを使用せず、AT&T構文を使用するLinux x86-64向けです。
。文章.globl_start_start: # _start はリンカが認識するエントリ ポイントですxor %ebp , %ebp # 実質的に RBP := 0 となり、スタック フレームの終わりをマークしますmov ( %rsp ), %edi # スタックから argc を取得します (暗黙的に 64 ビットにゼロ拡張されます) lea 8 ( %rsp ), %rsi # スタックから argv のアドレスを取得しますlea 16 ( %rsp , %rdi , 8 ), %rdx # スタックから envp のアドレスを取得しますxor %eax , %eax # ABI および icc との互換性のためcall main # %edi、%rsi、%rdx は main への 3 つの引数です (最初の 2 つは C 標準です)mov %eax , %edi # main関数の戻り値を_exit関数の最初の引数に渡すxor %eax , %eax # ABIおよびiccとの互換性のためcall _exit # プログラムを終了