■ 흔히들 /usr/bin/gcc가 C 컴파일러라고 알고 있겠지만, 엄밀한 의미에서 /usr/bin/gcc는 컴파일러가 아니다!


(1) 컴파일 과정
: /usr/bin/gcc는 내부적으로 전처리기인 cpp0 또는 cc1 -E 명령을 호출해 전처리 과정을 수행하고,
  진짜 C 컴파일러인 cc1을 호출해 컴파일한 후 어셈블리어인 as를 호출해 목적 코드로 만들고,
  마지막으로 링커를 호출하는 collect2를 호출하여 collect2가 내부적으로 링커인 ld를 호출해 라이브러리와 링크해
  실행파일을 만든다.

※ 즉 gcc는 실제 컴파일 과정을 담당하지 않고 전처리기와 C 컴파일러, 어셈블러, 링커를 각각 호출해 주는 역할만 한다.
    이렇게 각각의 컴파일 과정에 필요한 명령을 순차적으로 호출해 주는 것을 컴파일러 드라이버(compiler driver)라고
    부르고, /usr/bin/gcc는 C컴파일러 드라이버에 해당한다.

● cc : C 컴파일러 드라이버, gcc와 동일
● gcc : C 컴파일러 드라이버
● c++ : C++ 컴파일러 드라이버, g++ 과 동일
● g++ : 컴파일러 드라이버
● gcj: 자바 컴파일러 드라이버


(2) C 컴파일러
: 진짜 C 컴파일러는 /usr/libexec/gcc/i386-redhat-linux/4.2.1/cc1 이다.
  /usr/libexec/gcc/i386-redhat-linux/4.2.1 디렉토리에는 여러 실행 파일이 있는데, 각 실행파일의 역할은 다음과 같다.

● cc1 : C 컴파일러, -E 옵션을 붙이면 C 전처리기로 동작
● cc1plus : C++ 컴파일러, -E 옵션을 붙이면 C++ 전처리기로 동작
● collect2 : 링커(내부에서 링커인 ld를 호출해 링크함)
● f951 : 포트란 컴파일러


(3) gcc 컴파일 과정 단계별 설명



① gcc는 cpp0 또는 cc1 -E 를 호출해 전처리 과정을 거쳐 like.c 파일을 like.i 파일로 만든다.
② like.i 파일은 C컴파일러인 cc1에 의해 어셈블러 코드인 like.s로 컴파일 된다.
③ lisk.s 는 as 어셈블러에 의해 어셈블 과정을 거쳐 like.o 오브젝트 파일로 만들어 진다.
④ like.o 파일은 다시 collect2가 링커인 ld를 호출한 후 libc.a 같은 표준 C 라이브러리와 링크해 최종적으로 실행파일 like를
    만든다.

by 민트앤라떼 2011. 10. 14. 11:46