티스토리 뷰

이번 글을 통해 저희가 코드로 작성하는 .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단계는 아래 이미지와 같습니다.

출처 : Computer Systems A Programmer's Perspective

  • 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을 내므로 어셈블리어가 유용할 때도 있습니다.

출처 : Computer Systems A Programmer's Perspective

  • 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
링크
«   2025/04   »
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
글 보관함