앞에서 gcc를 설명할 때, 컴파일러와 링커의 역할에 대해 언급한 적이 있다.
참고 ➡️ gcc 컴파일부터 Makefile 이해하기
컴파일러는 .c 파일을 각각 .o라는 목적파일(object file)로 바꾼다.
링커는 이렇게 만들어진 .o 파일들을 모아 하나의 실행파일로 연결해준다.
그 이유는 바로 독립적인 컴파일이 가능해지기 때문이다.
위 그림처럼, 컴파일러는 .c 파일 하나하나를 개별적으로 .o 파일로 컴파일한다.
일단 각각 번역해두고 최종 연결은 링커에게 맡긴다.
이 방식은 대규모의 프로그램을 개발할 때, 더욱 큰 힘을 발휘한다.
대규모 프로그램에서는 수십, 수백 개의 .c파일이 존재한다.
만약 컴파일과 링킹과정을 분리해두지 않았다면?
main.c 파일 하나만 수정해도 다른 모든 파일까지 함께 컴파일을 해야하는 불필요한 낭비가 발생했을 것이다.
즉, 하나의 거대한 소스 파일로 구성하는 대신,
각 파일을 별도로 나눠 수정하고 컴파일할 수 있다는 점이 큰 장점이다.
앞에서 컴파일러와 링커의 역할을 대략적으로 살펴봤다면,
이번에는 이를 컴퓨터 하드웨어 관점, 특히 메모리 관점에서 살펴보자.
먼저 기본적으로 알아야 할 개념은 다음과 같다
디스크 = 데이터를 저장해두는 창고
메모리 = 프로그램을 실행하기 위한 작업 공간(책상)
.c, .o, .exe 파일들은 어디 있을까?.c 파일들과.o파일들,.exe이 모든 파일들은 디스크에 저장되어 있다.
디스크는 마치 물건을 보관하는 창고와 같다.
하지만,
컴퓨터가 이 프로그램을 실제로 실행하려면,
디스크에 있던 파일을 메모리(RAM)로 올려서 사용해야 한다.
즉, 작업하기 전 창고에서 꺼내 책상에 올려두는 것 처럼
프로그램도 실행되기 위해서는 메모리에 반드시 올라가야 한다.
🧙 이때 조력자가 등장한다.
프로그램을 실행하려면,
디스크에 있는 파일을 메모리에 올리는 작업이 필요하다.
이 일을 도와주는 조력자, 바로 로더(loader)다.
여기서 중요한 한 명 더 등장하는데,
그건 바로 커널(kernel)이다.
커널은 컴퓨터가 동작하는 데 있어 핵심적인 운영체제 코드로,
컴퓨터가 부팅되자마자 메모리에 올라가 항상 상주해 있는 친구다.
(이게 없으면 컴퓨터는 움직이지도 못한다!)
이 커널 내부에는
"로더" 역할을 하는 기능이 포함되어 있다.
우리가 프로그램을 실행하면 커널이 로더를 통해 실행파일을 디스크에서 읽어와, 메모리에 올려준다.

링커라서 링이 머리위에 달려있는건가요?