2013-04-10 12 views
5

あなたはCプログラム:__start

__start 

が内部Cでどのように使用されるか私が理解するのに役立つことはできますか?

main関数の正確なレプリカですか、それともコンパイルされたプログラムのエントリポイントですか?

ちょっと不思議なことに、その使い方は?

+2

状況を教えてください。 '__start'はどこで見たのですか? – NPE

+1

** **はエントリーポイントです。 –

答えて

11

は、プログラムの起動中に何が起こるかの概要です。の前には、mainの前に発生します。特に、__startであり、実際のエントリポイントがOSの観点からプログラムに表示されています。

これは、プログラム内でinstruction pointerのカウントが開始される最初のアドレスです。

そこコードは、物事をダウンさせるとmainが返さどんな終了コードでexitを呼び出して、あなたのmainを呼び出し、そして、ほんの一部のハウスキーピングを行うには、いくつかのCランタイム・ライブラリ・ルーチンを呼び出します。


百聞は一見にしかずです:私たちのコンパイラは、メイン知っているよう

C runtime startup diagram

+0

+1素晴らしいリンクです。 :) – lang2

+0

恐ろしいリンク!!! +1、それはサイトがある日、うまくいけばダウンされる場合は、その中の主要なものを引用することは可能ですか? – 0x90

+0

将来的に記事が死んでしまった場合は、おそらくWayback Machineが役立つかもしれません(https://web.archive.org/web/20170822123701/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup。 html)。 – ulidtko

0

_startは...任意のプログラムのエントリポイントである、オペレーティングシステムの機能....です(mainはあらかじめ定義された関数ではなく、すべてのコンパイラがそれを知っています)この_start関数はmainを呼び出し、その時点からプログラムがCPUに入ります

+1

私は、あなたが説明する必要がありますね! お試しいただきありがとうございます。 – San

0

C/C++標準では、main()が出発点ですのプログラム。 GCCを使用している場合、_start関数は、main()を呼び出すCプログラムのエントリポイントです。 _start()の主な仕事は、いくつかの初期化タスクを実行することです。

// $ gcc program_entry.c -nostartfiles 
// $ ./a.out 
// custom program entry 

#include <stdio.h> 
#include <stdlib.h> 

void program_entry(void); 


void 
_start(void) 
{ 
    program_entry(); 
} 

void 
program_entry(void) 
{ 
    printf("custom program entry\n"); 
    exit(0); 
} 

したい場合は、プログラムのエントリもGCCで-eスイッチを指定してコンパイルすることができます。

// $ gcc program_entry.c -e __start 
// $ ./a.out 
// custom program entr 

#include <stdio.h> 

void program_entry(void); 


void 
_start(void) 
{ 
    program_entry(); 
} 


void 
program_entry(void) 
{ 
    printf("custom program entry\n"); 
}