글
■ 흔히들 /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를
만든다.
'L inux > Compile' 카테고리의 다른 글
컴파일(Compile)과정 - cc1에 의한 어셈블리 소스 파일로 컴파일 (0) | 2011.10.20 |
---|---|
컴파일(Compile)과정 - cc1 -E에 의한 전처리 과정 (0) | 2011.10.14 |
컴파일 (Compile) (0) | 2011.10.14 |
크로스 컴파일 (Cross Compile) (0) | 2011.10.06 |
GCC(GNU Compiler Collection) (0) | 2011.09.29 |
RECENT COMMENT