c언어의 컴파일 과정에 대해 Run 버튼만 누르면 알아서 해줘서 딱히 생각이 없다가 강의를 들으면서, "원리도 모르고 쓰고 있었네?" 라는 생각이 씨게 와서 글로 남기게 됐다.
과정
0. 시작 파일 : hello.c
1. 전처리 : hello.i
- 수행은 전처리기가 한다.
- gcc(gnu compiler collection)을 이용해서 확인 가능하다.
- 명령어 : gcc -E hello.c -o hello.i
- 보통 컴파일이 책을 통으로 번역하는 작업이라 한다. 그런 관점에서 전처리는 책을 번역하기 전에 책에서 인용한 참조 문서들을 가져오는 작업이라고 할 수 있겠다.
- 가져오기만 하고 번역은 하기 전이다.
- 즉, 전처리의 결과는 아직 소스코드인 상태다.
- 수행 작업
- 파일을 읽고 외부에 선언된 다양한 소스코드,라이브러리 가져오기 (예를 들어 #include 코드를 코드를 읽고 가져옴)
- 프로그래밍의 편의를 위해 작성된 매크로도 변환(예를 들어 #define)
- 컴파일할 영역 명시
- 전처리된 파일(약 500줄) hello.i
2. 컴파일 : hello.s
- 컴파일러가 진행한다.
- 명령어 : gcc -S hello.i -o hello.s
- hello.c파일도 바로 변환 가능
- 명령어 : gcc -S hello.c -o hello.s
- 명령어 : gcc -S hello.i -o hello.s
- 전처리가 완료된 소스코드를 저급 언어(어셈블리어)로 변환
- 어셈블리어 파일 hello.s
3. 어셈블 : hello.o
- 어셈블러가 진행한다.
- 명령어 : gcc -o hello.o hello.s
- 어셈블리어를 기계어로 변환하는 과정
- 결과는 목적 코드를 포함하는 목적 파일이 됨
- 명령어 : xdd hello.o를 이용해서 확인한 hello.o파일 내부
4. 링킹 : example.exe (마지막 단계)
- 링커가 수행
- 어셈블의 결과로 파일은 기계어로 번역된 목적 파일이지만 실행 파일은 아니다.
- 목적 파일은 링킹을 거친 이후에 실행 파일이 된다. (둘다 기계어이긴 함)
- 각기 다른 목적파일을 하나의 실행파일로 묶어주는 작업
- 번역된 책들을 엮어줘야 순서대로 책을 읽을 수 있다고 생각하면 편하다
(혹시 명령어중 gcc에 대해 궁금하면 아래 블로그 글을 보면 좋다.)
출처 & 참고문헌
(초보자가 혼자 공부한 내용을 정리하기 위한 글입니다. 잘못된 내용이나 추가로 필요한 내용이 보이시면 편하게 말씀해주세요.)
'CS' 카테고리의 다른 글
실수계산 오차와 부동소수점 ( feat. IEEE 754 표준 ) 1부 (1) | 2024.11.25 |
---|---|
SOLID원칙의 간단한 정리 (0) | 2024.06.23 |
소켓이란? (0) | 2023.12.19 |
자바 인코딩의 원리 (2) | 2023.11.08 |
API (Application Programming Interface ) 개념 설명 (0) | 2023.06.21 |