LuvSea

Linux gcc compile의 흐름 본문

sTudy

Linux gcc compile의 흐름

사랑海 2009. 4. 14. 20:40
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
hello.c라는 파일이 있다고 가정하자.
기본적으로 gcc에서 또는 VC에서는 다음의 과정을 거치게 된다.



위의 c파일에서 전처리기(Preprocessor)를 통해 전처리 과정을 거치게 되고, 그 결과 "hello.i"파일이 생성된다. 그리고 컴파일러(Compiler)에서 하드웨어에 종속적인 어셈블리코드인 "hello.s"를 생성하게된다.(VC에서는 ".asm") 그 이후 어셈블러(Assembler)에 의해 어셈블코드는 목적파일인 오브젝트파일 "hello.o"를 생성(VC에서는 "hello.obj")하고,  이 오브젝트 파일은 링킹(Linking)과 재배치(Relocation)과정을 거쳐 실행파일인 hello파일(VC에서 "hello.exe")이 생성된다.

이러한 중간 과정에서 생성되는 파일은 일반적으로 보여지지 않지만
gcc의 옵션을 다음과 같이 주고 실행하게 되면 확인 할 수 있다.
gcc --save-temp -o hello hello.c


먼저 전처리 과정의 산물이  "hello.i"파일을 살펴보자.

전처리 과정에서 무엇인지 알지 못할 많은 코드들이 찍혀있다.
마지막에는 코드의 내용을 담고 있는데 vi명령모드에서 G 를 살포시 눌러준다음 문서의 맨 마지막으로 가면 hello한줄 print할려고 900줄이 넘는 전처리 코드가 생성된 것을 확인 할 수가있다.

다음으로 목적파일인 "hello.s"파일을 살펴보자.

그림을 보면 많이 보아왔던 어셈블리코드를 확인 할 수있다.
여기서 중요한것은 위의 전처리코드나 어셈블리코드가 gcc와 vc는 틀리다는것이다.
이유를 간단히 말하자면 GNU C 컴파일러인 gcc와 VC의 C컴파일러인 cl은 C표준에 따라 결과는 같은 결과를 생성하지만 그 중간과정은 표준이 아니기 때문에 각각의 특성에 따라 소스가 다르게 생성되는것이다.
자~ 이제 한번씩 다 해보시길 바래요~ ㅎㅎ
Comments