이번 시간에는 C언어의 매크로함수에 대해 알아보고자 한다.
우리가 늘 사용하는 gcc는 여러 실행파일을 연달아 호출하는 일종의 tool-chain이다.
gcc안에서 collect라는 용어를 사용하는 것도 이 때문일 것이다.
'gcc hello.c hello2.c'를 호출하게 되면 다음과 같은 단계를 거쳐서 a.out라는 실행파일을 만들어 낸다.

  1) Preprocess: hello.c --> hello.i
     gcc에서 .i파일은 전처리과정을 마친 파일을 의미한다.
  2) 코드생성: hello.i --> hello.s
     .i파일로부터 gnu assembly언어의 파일을 생성시킨다.
  3) hello.s --> hello.o
     '분리컴파일'라는 용어가 적용되는 hello.o단독으로 실행될수 없는 코드파일이다.
     hello.o과 같은 파일을 하나의 파일로 묶은 것이 바로 .a접미사를 archive파일이다.
  4) hello.o,hello2.o --> a.out
     실행파일 a.out은 사용자가 지정한 파일로부터 얻은 오브젝트에 gcc내부에 가지고 있는 여러가지 stub옵브젝트
     printf함수가 최종적으로 호출해야하는 crt함수들에 관련된 오브젝트파일을 링킹시킨다.


gcc 버젼에 따라 다를 수 있지만 기본적인 원리는 이와 같다고 볼 수 있다.


자신의 시스템에 설치된 gcc에 대해 그 과정을 확인해 보기 위해서는 다음과 같이 -v옵션을 주어 테스트해 볼 수있다.

우선 hello.c를 작성하여 'gcc -v hello.c'을 실행시켜 보자

gcc_1.png 

gcc_2.png 


cc1이라는 것이 gcc의 핵심인데 hello.c으로부터 hello.s를 만들고 있다.
gcc_3.png

전처리과정에서 참조하는 헤더파일의 위치도 나열되어 있다.

gcc_4.png 

위의 헤더디렉토리는 gcc가 기본적(default)으로 달아 주는 것이고,추가하지않도록하는옵션이있는데

바로 -nostdinc이다.


as라는 것이 gnu-as이며 hello.o을 생성시키고 있다.

gcc_5.png


마지막으로 collect2라는 실행파일 안에서 crt1.o, crtbegin.o libgcc.a, libgcc_s.a crtend.o crtn.o과
같은 오브젝트파일을 링크(ld)시켜서 최종적으로 a.out을 만들어 낸다.

gcc_6.png

위에서 사용자가 제공한 오브젝트외에 어떠한 옵젝트 파일도 덧붙이지 않게 하기 위해서는 -nostdlib라는 옵션을 주면 된다.