Notion link : https://melon-taker-d3e.notion.site/1-9076ce3903e647e6a8691d8b261d31c2

C 코드를 실행하려면 소스 코드를 기계 코드로 변환해야 합니다. 이를 위해 전처리, 컴파일 및 링킹 단계를 거쳐야 합니다.
전처리 단계에서는 소스 코드의 일부를 다른 코드로 대체하고 전처리기 지시문(#으로 시작하는 문장)이 처리됩니다. 전처리기 지시문은 상수 또는 매크로를 정의하는 '#define' 형식으로 사용됩니다. 또한 '#include' 지시문을 사용하여 다른 헤더 파일을 가져올 수 있습니다.
#include<stdio.h>
#define MAX 100
위의 예에서는 stdio.h 헤더 파일을 가져오고 MAX를 전처리 단계에서 100으로 정의합니다.
컴파일러는 전처리된 코드를 어셈블리 코드로 변환합니다. 어셈블리 코드는 기계 코드로 직접 실행할 수 없지만 기계 코드로 변환하기 충분히 가깝습니다.
int main()
{
printf("Hello, World!");
return 0;
}
위의 예에서 컴파일러는 이 코드를 어셈블리 코드로 변환합니다.
.file "hello.c"
.section .rodata
.LC0:
.string "Hello, World!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
leave
ret
컴파일러가 소스 코드를 어셈블리 코드로 변환한 후, 어셈블러는 이를 오브젝트 파일로 변환합니다. 오브젝트 파일은 어셈블리 코드를 기계 코드로 변환하기 위해 사용되는 중간 파일입니다. 오브젝트 파일은 링커와 결합하여 여러 개의 오브젝트 파일을 결합하여 실행 파일을 만드는 데 사용됩니다.
링킹 단계에서 컴파일러는 오브젝트 파일과 라이브러리 파일을 링크하여 실행 파일을 만듭니다. 오브젝트 파일은 컴파일러에서 생성된 어셈블리 코드를 포함하는 이진 파일입니다. 오브젝트 파일은 링커와 결합하여 여러 개의 오브젝트 파일을 결합하여 실행 가능한 파일을 만드는 데 사용됩니다. 링킹 프로세스에서 함수 또는 변수를 서로 연결하여 하나의 실행 파일을 만듭니다.
예를 들어, 다음 코드가 있다면:
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
이 코드를 컴파일하고 링크하면 실행 파일이 생성됩니다. 이 실행 파일을 실행하면 "Hello, World!"가 출력됩니다.