C 프로그래밍 시 코드를 작성하고 실행하는 과정에서 컴파일(compile)을 하게 된다.
컴파일러가 컴파일을 하는 과정을 알아보았다.
컴파일 (Compile)
인간이 이해하고 사용하기 쉬운 코드를 기계가 이해하기 쉽도록 변환하는 작업을 뜻한다.
예) C, C++, Java (High level) → 기계어 (Low level)
컴파일 명령
gcc 컴파일러를 이용했을 때, c언어 파일을 다음과 같은 명령어를 통해 컴파일할 수 있다.
gcc -o hello hello.c
명령어를 순서대로 살펴보면,
- -o: output을 의미
- hello: 최종 실행파일 이름
- hello.c: 실행하고자 하는 소스 파일
컴파일 과정
컴파일은 다음의 과정으로 이루어진다.
전처리(Pre-processing) → 컴파일(Compilation) → 어셈블리(Assembly) → 링킹(Linking)
총 4번의 커다란 과정을 통해 컴파일이 진행되는데, 세부적으로 위 과정들을 살펴보았다.
1. 전처리 (Pre-processing)
전처리기를 통해 소스 코드 파일(.c)을 수정하여 아래와 같은 작업을 수행한 후 (.i) 파일로 변환해주는 과정이다.
- 헤더파일 삽입: 컴파일러가 쉽게 인식할 수 있도록 C언어 소스를 재정리한다.
- 주석 제거: 주석은 인간이 쉽게 표시하고 소통하기 위한 수단이므로 컴퓨터에겐 필요없는 내용이다.
- 치환 작업: 대표적으로 #define 지시문을 사용한 부분들에 정의된 값으로 바꾸어준다. 예를들어, #define을 통해 상수를 정의하였다면 해당 상수를 사용한 부분들에 대입한다.
2. 컴파일 (Compilation)
컴파일 과정의 핵심부로, 컴파일러를 통해 전처리된 소스 코드 파일(.i)를 어셈블리어 파일(.s)로 변환해주는 과정이다.
이때 언어의 문법이 올바르게 작성되었는지 검사가 이루어지게 된다.
3. 어셈블리 (Assembly)
어셈블러를 통해 어셈블리어 파일(.s)을 오브젝트 파일(.o)로 변환해주는 과정이다.
이때의 오브젝트 파일은 재배치 가능한 오브젝트 파일(Relocatable Object File)로, Relocatable Object File는 binary code와 data를 가지고 있으며, 실행 가능한 오브젝트 파일을 만들기 위한 파일이다.
※ 오브젝트 파일 구조
4. 링킹 (Linking)
링커를 통해 여러 개로 흩어져 있는 오브젝트 파일들과 표준 C 라이브러리, 사용자 라이브러리를 묶어 실행 가능한 오브젝트 파일(Excutable Object File)로 만드는 과정이다.
결과물로 실행 파일(.exe)이 산출된다.
※ Object File vs Excutable Object File
참고자료
https://pediaa.com/what-is-the-difference-between-object-file-and-executable-file/
What is the Difference Between Object File and Executable File - Pediaa.Com
The main difference between object file and executable file is that an object file is a file generated after compiling the source code while an executable file is a file generated after linking a set of object files together using a linker. An object file
pediaa.com
3. C언어의 컴파일 과정
이번에는 C언어의 컴파일 과정을 알아보도록 하겠습니다. 우리가 작성한 C 소스 코드를 컴파일러가 컴파일을 하여 어떻게 실행파일을 만들어 내는 지에 대해서 알아보겠습니다. 기본적인 컴파
www.it-note.kr