강좌 & 팁
이번 시간에는 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'을 실행시켜 보자
cc1이라는 것이 gcc의 핵심인데 hello.c으로부터 hello.s를 만들고 있다.
전처리과정에서 참조하는 헤더파일의 위치도 나열되어 있다.
위의 헤더디렉토리는 gcc가 기본적(default)으로 달아 주는 것이고,추가하지않도록하는옵션이있는데
바로 -nostdinc이다.
as라는 것이 gnu-as이며 hello.o을 생성시키고 있다.
마지막으로 collect2라는 실행파일 안에서 crt1.o, crtbegin.o libgcc.a, libgcc_s.a crtend.o crtn.o과
같은 오브젝트파일을 링크(ld)시켜서 최종적으로 a.out을 만들어 낸다.
위에서 사용자가 제공한 오브젝트외에 어떠한 옵젝트 파일도 덧붙이지 않게 하기 위해서는 -nostdlib라는 옵션을 주면 된다.