C언어의 컴파일 과정
C언어로 만든 코드, 이를테면 main.c라는 이름을 가진 파일을 컴파일 하면 그 결과로 main.exe 파일이 생성된다. 하지만 실행 파일은 한 번에 생성되는 것이 아니라 전처리기 - 컴파일러 - 어셈블러 - 링커를 통과하는 일련의 과정을 거쳐 생성된다.

전처리 과정 (pre-processing, main.c → main.i)
- 본격적으로 컴파일 하기 전에 처리할 작업들을 관리
- 외부에 선언된 다양한 소스 코드, 라이브러리를 포함한다. (e.g. #include)
- 프로그래밍의 편의를 위해 작성된 매크로를 변환한다. (e.g. #define)
- 컴파일할 영역을 명시한다.
컴파일 과정 (compile, main.i → main.s)
- 전처리가 완료되어도 여전히 소스 코드 상태로 남아있다.
- 전처리 완료된 소스 코드를 저급 언어 (어셈블리어)로 변환한다.
어셈블 과정 (assemble, main.s → main.o)
- 어셈블리어를 기계어로 변환
- 목적 코드를 포함하는 목적 파일이 된다.
링킹 (linking, main.o → main.exe)
- 각기 다른 목적 파일을 하나의 실행 파일로 연결시켜주는 작업으로, 목적 파일들과 프로그램에서 사용된 라이브러리, 사용자 라이브러리 등을 링크한다.
- 링크 단계가 끝나면 실행 파일이 생성된다.
참고자료
C언어의 컴파일 과정
C언어로 만든 코드, 이를테면 main.c라는 이름을 가진 파일을 컴파일 하면 그 결과로 main.exe 파일이 생성된다. 하지만 실행 파일은 한 번에 생성되는 것이 아니라 전처리기 - 컴파일러 - 어셈블러 - 링커를 통과하는 일련의 과정을 거쳐 생성된다.

전처리 과정 (pre-processing, main.c → main.i)
- 본격적으로 컴파일 하기 전에 처리할 작업들을 관리
- 외부에 선언된 다양한 소스 코드, 라이브러리를 포함한다. (e.g. #include)
- 프로그래밍의 편의를 위해 작성된 매크로를 변환한다. (e.g. #define)
- 컴파일할 영역을 명시한다.
컴파일 과정 (compile, main.i → main.s)
- 전처리가 완료되어도 여전히 소스 코드 상태로 남아있다.
- 전처리 완료된 소스 코드를 저급 언어 (어셈블리어)로 변환한다.
어셈블 과정 (assemble, main.s → main.o)
- 어셈블리어를 기계어로 변환
- 목적 코드를 포함하는 목적 파일이 된다.
링킹 (linking, main.o → main.exe)
- 각기 다른 목적 파일을 하나의 실행 파일로 연결시켜주는 작업으로, 목적 파일들과 프로그램에서 사용된 라이브러리, 사용자 라이브러리 등을 링크한다.
- 링크 단계가 끝나면 실행 파일이 생성된다.
참고자료