■ GCC의 정의
: GCC는 GNU Compiler Collection 의 준 말로  전에는 C Compiler 였으나, C++이나 자바, 포트란 등을 모두 컴파일 할 수 있을 정도로 커져서 컴파일러 콜렉션이라고 바뀌었다.


■ 컴파일 과정
: 전처리기(Preprocessing) -> 컴파일(Compile) -> 어셈블리(Assembly) -> 링크(Link)
이 과정을 GCC 하나로 모두 진행 시켜서 소스파일을 실행파일로 생성.

(1) 전처리기
: 전처리기는 cpp(C pre processor)이며, 소스파일의 주석 제거 및 define을 치환하는 기능 등을 한다. (*.i)
  ○ 전처리가 끝이 나면 i 확장자를 가진 파일이 생성된다. 본격적으로 C언어를 기계어로 변환하기 시작한다.

(2) 컴파일
: 컴파일은 cc(C Compiler)이며, 전처리기를 거친 소스파일을 어셈 파일로 변환한다. (*.s)
  ○ 기계어와 가장 유사한 상태인 어셈블리어로 변환 된 s 확장자를 가진 파일이 생성된다.

(3) 어셈블리
: 어샘블리는 as(Assembler)이며, 어셈파일을 오브젝트 파일로 변환한다. (*.o)
  ○ 2진수로 이루어진 기계어로 된 o 확장자를 가진 파일이 생성된다.

(4) 링크
: 링크는 ld(Linker)이며, 오브젝트 파일들을 묶어서 실행파일로 변환해 준다. (*.exe)
  ○ 실행할 수 있는 파일이 생성된다.


■ 중간 파일 생성 방법
: 전처리에서 어셈블리까지의 과정에서 중간 파일이 생성된다. 하지만 실행파일이 생성되면 그 과정에 생성되는 중간 파일들은 모두 삭제된다. 중간 파일의 내용이 궁금하다면 중간 파일만 생성하는 gcc 옵션들이 있다. 중간 파일만 생성하는 방법을 알아보자.(hello.c 파일의 경우)

(1) 전처리 단계
# gcc -E -o hello.i hello.c : hello.c 소스코드를 전처리 해서 hello.i 파일에 저장한다.

(2) 어셈블리 파일 단계
# gcc -S -o hello.s hello.c : hello.c 소스코드를 컴파일해서 hello.s 어셈블리어 소스로 저장한다.

(3) 오브젝트 파일 단계
# gcc -c -o hello.o hello.c : hello.c 소스코드를 컴파일해서 링크 전 단계인 오브젝트 파일 hello.o 를 생성한다.


■ 전체단계 출력 및 저장
: 특정 단계까지만 컴파일하면 번거롭다 이를 모두 저장해주는 옵션 또한 존재한다. 컴파일 과정을 모두 출력하면서 각 단계마다 생성되는 중간 파일을 삭제하지 않고 모두 저장해주는 옵션이 있다.

# gcc -v --save-temps -o hello hello.c

-v 옵션 : 컴파일되는 과정을 화면에 출력한다.
--save-temps 옵션 : 컴파일 과정에서 발생되는 중간 파일을 지우지 않고 저장한다.


■ 컴파일 옵션
: GCC는 옵션이 아주 많이 있지만, 자주 쓰이는 옵션은 제한 되어 있다.

--help : 간단한 옵션을 출력해줍니다.
--version : gcc의 버젼을 출력해 줍니다.

-o : 출력 파일명을 지정할 때 사용합니다.
-c : 링킹 과정을 진행 하지 않고 .o 파일인 오브젝트 파일까지만 생성 하게 됩니다.
-S : 어셈블러까지 진행 하지 않고, 컴파일러까지의 출력은 .S 어셈블러 파일을 생성하게 됩니다.
-O1 ~ -O3 : 최적화 수준을 지정합니다. 숫자가 클수록 높은 수준의 최적화를 하게 됩니다.
-g : 디버깅을 위한 정보를 컴파일 하면서 생성하게 됩니다.
-D : define 을 할수 있는 옵션입니다.
-l (엘) : 라이브러리 이름을 지정합니다.
-L : 추가 라이브러리 디렉토리를 지정합니다.
-W : 모든 에러 메시지 출력
-w : 모든 에러 메시지를 출력 하지 않음
-I(아이) : 추가 헤더 파일이 있는 디렉토리를 지정합니다.


※ 출처 : http://cafe.naver.com/linuri.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=314


by 민트앤라떼 2011. 9. 29. 17:35