우리가 c언어로 hello.c(소스 파일 또는 소스 코드)를 만들고 컴퓨터 시스템에서 실행시키려면 각 C 문장들은 다른 프로그램에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 이 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이러니 디스크 파일로 저장됩니다. 목적프로그램은 실행가능 목적 파일이라고도 부른다.
컴파일러 드라이버는 유닉스 시스템에서 다음과 같이 소스파일에서 오브젝트 파일로 번역한다.

위에 그림과 같이 우리가 쓴 hello.c를 컴퓨터가 읽으려면 4단계를 거칩니다. 이 4단계를 실행하는 프로그램들(전처리기, 컴파일러, 어셈블러, 링커)을 합쳐서 컴파일 시스템이라고 부릅니다.
- 전처리 단계 : 전처리기(cpp)는 본래 C 프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다. 예를 들어 hello.c 파일 첫 줄의 #include <stdio.h>는 전처리기에게 시스템 헤더파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다. 그 결과 일반적으로. i로 끝나는 새로운 C 프로그램이 생성된다.
- 컴파일 단계 : 컴파일러(ccl)는 텍스트 파일 hello.i를 텍스트파일인 hello.s로 번역하며, 이 파일은 어셈블리어 프로그램이 저장된다. 이 프로그램은 다음과 같은 main 함수의 정의를 포함된다.

2 ~ 7줄에서는 한 개의 저수준 기계어 명령어를 텍스트 형태로 나타내고 있습니다. 어셈블리어는 여러 상위 수준 언어의 컴파일러들을 위한 공통의 출력언어를 제공하기 때문에 유용합니다. e.g. C와 Fortan 컴파일러는 둘 다 동일한 어셈블리어로 출력 파일을 생성합니다.
- 어셈블리 단계 : 다음에는 어셈블러(as)가 hello.s를 기계어 인스트럭션으로 번역하고, 이들을 재배치가능 목적프로그램의 형태로 묶어서 hello.o라는 목적 파일에 그 결과를 저장한다. 이 파일은 main함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일이다. hello.o 파일을 텍스트 편집기로 열어보면 쓰레기 같은 데이터로 보일 것이다.
- 링크 단계 : hello프로그램이 C 컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 printf 함수를 호출하는 것에 주목할 필요가 있다. printf 함수는 이미 컴파일된 별도의 목적파일인 printf.o에 들어 있으며, 이 파일은 hello.o 파일과 어떤 형태로든 결합되어야 한다. 링커 프로그램(Id)이 이 통합 작업을 수행한다. 그 결과 hello 파일은 실행가능 목적파일(즉, 실행파일)로 메모리에 적재되어 시스템에 의해 실행됩니다
'CSAPP > 1장' 카테고리의 다른 글
[CSAPP] 1-5 캐시가 중요하다. (0) | 2025.03.27 |
---|---|
[CSAPP] 1-4 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다. (0) | 2025.03.25 |
[CSAPP] 1-3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다 (0) | 2025.03.25 |
[CSAPP] 1-1 정보는 비트와 컨텍스트로 이루어진다. (0) | 2025.03.25 |