티스토리 뷰
이번 글을 통해 저희가 코드로 작성하는 .c 파일이 실제로 어떻게 실행 파일이 되는지 그 과정에 대해 설명하도록 하겠습니다.
C를 조금이라도 해보셨던 분이라면 아래와 같이 Hello World를 출력하는 프로그램을 작성해보셨을 겁니다.
아래 소스 코드 파일을 hello.c라고 하겠습니다.
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
이 hello.c는 단지 사람만이 해석할 수 있으며 컴퓨터는 해석하지 못합니다.
따라서 컴퓨터가 우리가 작성한 hello.c를 해석하고 실행할 수 있도록 하려면 다른 프로그램을 이용하여 컴퓨터가 이해할 수 있는 기계어로 바꾸어 주어야(translate) 합니다.
hello.c를 컴퓨터로 이해할 수 있는 기계어(명령어)로 번역하여 모아둔 것을 executable object program(혹은 executable object files)이라고 불립니다.
저는 단순히 컴퓨터가 다른 과정을 거치지 않고 바로 실행할 수 있는 상태의 프로그램이라고 이해하고 있습니다.
또한, 이 executable object program은 binary file로서 저희가 쓰는 컴퓨터의 디스크(저장 장치)에 저장됩니다.
linux 환경에서 우리는 hello.c를 통해 hello라는 binary file를 만들기 위해 아래와 같은 커맨드를 사용합니다.
$ gcc -o hello hello.c
이 커맨드를 실행하게 되면 4단계의 과정을 거쳐 hello라는 binary file이 생기게 됩니다.
그 4단계는 아래 이미지와 같습니다.
- Preprocessing 단계(전처리 단계)
Preprocessor는 '#'으로 시작하는 지시문에 따라 기존의 .c 파일을 수정하여 .i 확장자의 text 파일을 생성합니다.
예로, #include <stdio.h>와 같은 라인은 preprocessor가 시스템 헤더 파일인 stdio.h의 내용을 가져와 text 파일인 hello.i에 붙여넣습니다.
따라서 Preprocessing의 결과는 hello.i가 됩니다. - Compilation 단계(컴파일 단계)
Compiler는 hello.i를 가지고 어셈블리어로 구성된 hello.s라는 텍스트 파일을 생성하는 작업을 합니다.
hello.s는 아래 이미지와 같이 main 함수를 어셈블리어로 표현합니다.
2번째부터 7번째 줄은 각각 하나의 low-level 기계어 명령어를 텍스트적으로 표현한 겁니다.
다른 프로그래밍 언어, 다른 컴파일러라고 해도 어셈블리어 단에서는 똑같은 output을 내므로 어셈블리어가 유용할 때도 있습니다.
- Assembly 단계
Assembler는 hello.s를 기계어로 된 명령으로 바꾸고 hello.o라는 object 파일에 그 결과를 저장합니다. (이 hello.o를 relocatable object program이라고 부른다고 합니다.)
이 hello.o라는 파일은 main 함수의 명령어를 encode한 것으로 구성된 binary file입니다.
이 때부터는 파일을 text editor로 열어보면 사람이 해석할 수 없는 형태로 보이게 됩니다. - Linking 단계
hello.c에서는 printf라는 함수를 사용합니다.
printf 함수는 printf.o라는 미리 컴파일된 object file에 그 내용이 담겨져 있습니다.
우리가 만들려는 hello 프로그램은 이 printf.o 파일이 필요하며 hello.o와 printf.o를 서로 합쳐야(merge) 합니다.
이 작업을 해주는 것이 바로 linker이며 linker를 통해 저희가 원하는 exectuable object program이라고 불리는 hello 파일이 생기게 됩니다.
이 hello 파일은 메모리에 load되고 시스템에 의해 실행될 준비를 모두 다 마친 상태의 파일입니다.
저희가 작성하는 C 코드는 위와 같은 과정을 거쳐 실행 가능한 파일을 만들어 내게 됩니다.
혹시 이 글을 읽으시다가 이해가 안 되는 부분이나 설명이 부족한 점 혹은 이상한 점이 있다면 언제든지 댓글 남겨주시면 감사하겠습니다.
- Total
- Today
- Yesterday
- UART
- c
- SPI
- 컴파일
- 드론
- PID
- 터미널
- DCM
- 고도필터
- compile
- pwm
- 드론개발
- 멤버 초기화 리스트
- 컴퓨터구조
- 로그
- 칼만필터
- C++
- 오실로스코프
- 초기화 리스트
- Effective C++
- STM32
- teraterm
- DMA
- computer_science
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |