C 언어 컴파일 과정


Compile

원시 프로그램은 컴파일러를 통해 오브젝트 파일(목적프로그램)로 바꿔진다.

이 단계에서 아래와 같은 절차가 이뤄진다.

 

- 만약 원시프로그램 이름이 a.c라면 a.c에 대하여 전처리기(preprocessor)를 수행시키고, 그 결과를 전처리된 임시파일에 저장한다.

   # cpp [other-command-line options] a.c /tmp/a.i

 

- a.i에 대하여 컴파일러를 수행시키고, a.s라는 어셈블러 코드를 생성한다.

# cc1 [other-command-line options] /tmp/a.i -o /tmp/a.s

 

- a.s에 대하여 어셈블러를 수행시키고, a.o라는 오브젝트 파일을 생성한다.

# as [other-command-line options] /tmp/a.s -o /tmp/a.o

 

cpp, cc1, as GNU의 전처리기, 컴파일러, 어셈블러를 각각 나타내며, GCC 배포본 안에 들어있다.

 

Linking

오브젝트 파일을 필요한 라이브러리와 연결시켜(링크) 컴퓨터가 알 수 있는 기계어로 바꾼다. 그러면 실제로 실행 가능한 파일을 생성하게 된다.

 # ld [other-command-line options] /tmp/a.o -o a.out

 

리눅스의 gcc는 컴파일 시 자동으로 링크까지 수행한다. 생성된 실행 파일은 리눅스의 경우 특별히 이름을 지정하지 않으면 a.out라는 이름이 만들어진다.

 

최종적으로 만들어진 실행파일(a.out)은 이제 로드 될 준비가 되었다. 이것을 실행시키기 위해서 우리는 쉘 프롬프트 상에서 아래와 같이 타이핑한다.

 # ./a.out

 

그러면 쉘은 로더를 불러 a.out의 코드와 데이터를 메모리로 복사하고, 프로그램내의 제일 처음으로 제어권을 넘긴다. 여기서 말하는 로더는 execve라는 것으로 실행 가능한 오브젝트 파일의 코드와 데이터를 메모리로 로드하고 그 프로그램의 첫번째 명령어가 저장된 주소로 점프함으로써 프로그램을 수행하게 한다.

a.out이라는 명칭은 a.out 오브젝트 파일들 안에 있는 어셈블러의 출력물에서 그 유래를 찾을 수 있다. 그 이후로 오브젝트 형식은 다양하게 바뀌어 왔지만, 그 이름은 계속 사용 되어지고 있다.

'Development > C' 카테고리의 다른 글

심볼 테이블 (Symbol Table)  (0) 2012.01.31
프로그래머 10계명  (1) 2011.09.25
심볼 테이블  (0) 2011.07.31
toolchain 이란  (0) 2011.02.12
C - 문자 '0'과 문자 '\0'의 차이 그리고 NUL과 NULL의 차이  (0) 2011.02.12
Posted by linuxism
,