컴파일러 드라이버와 정적 링킹
C 프로그램은 단순히 컴파일만으로 끝나지 않습니다. 전처리 -> 컴파일 -> 어셈블 -> 링크 과정을 거쳐야 비로소 실행 가능한 파일이 되는데요. 이 글에서는 CSAPP 7.1~7.2절 내용을 바탕으로 컴파일러 드라이버(gcc)와 정적 링킹(static linking)에 대한 핵심 개념을 학습하고, 이후 본문 학습이 훨씬 효율적으로 진행될 수 있도록 배경지식을 정리해 보려 합니다.
7.1 컴파일러 드라이버, 정말 많은 일을 하는 gcc
gcc main.c라는 명령 하나로 사실상 다음의 4단계 작업이 자동으로 수행됩니다.
단계 | 도구 | 설명 | 출력파일 |
1. 전처리 | cpp (C preprocessor) | #include, #define 처리 | main.i |
2. 컴파일 | cc1 (C compiler phase 1) | C 코드 -> 어셈블리 | main.s |
3. 어셈블 | as (assembler) | 어셈블리 -> 목적 파일 | main.o |
4. 링크 | ld (link editor, loader에서 유래) | 목적 파일들 -> 실행파일 | a.out 또는 지정한 이름 |
단계별 명령어 예시
gcc -E main.c -o main.i # 전처리만 수행
gcc -S main.c -o main.s # 어셈블리 코드 생성
gcc -c main.c -o main.o # 목적 파일 생성
gcc main.o -o prog # 링크 및 실행 파일 생성
gcc -v main.c # 내부 실행 명령 추적
책에서는 이 흐름을 간략히 도식으로 소개하고 넘어가지만, 이 구조를 미리 이해해두면 이후 등장하는 각 파일(.i, .s, .o)의 역할이 확실히 잡히게 됩니다.
7.2 정적 링크, 목적 파일을 하나로 묶기
정적 링크는 여러 목적 파일(.o)을 하나의 실행파일로 묶는 과정입니다.
예를 들어 아래의 명령어를 입력해 보겠습니다.
gcc -c main.c # → main.o 생성됨
gcc -c sum.c # → sum.o 생성됨
gcc main.o sum.o -o prog
이때 main.o에서 호출한 sum() 함수가 sum.o에 정의되어 있어야 링커가 이를 제대로 연결할 수 있는데요. 그렇지 않으면 이런 에러가 발생하게 됩니다.
undefined reference to 'sum'
책에서는 이 예시를 중심으로 링커의 심볼 해석 역할과 정의 vs 참조, 심볼 충돌, undefined symbol 등 링크 에러의 의미를 소개합니다.
핵심 정리
- gcc는 전처리~링크까지 전체 빌드 과정을 자동으로 수행해주는 드라이버 프로그램
- 정적 링킹은 .o 파일을 묶고, 함수/변수 심볼을 해석하고 연결하는 과정이다.
- undefined reference는 링커가 심볼을 찾지 못할 때 발생한다.
- 실습 명령어들(-E, -S, -c, -v)을 통해 각 단계의 결과를 확인할 수 있다.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다 (0) | 2025.04.17 |
---|---|
[CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일 (0) | 2025.04.17 |
[CSAPP 3장 완전 정복] 3.11 부동소수점 연산은 어떻게 이루어질까? (0) | 2025.04.09 |
[CSAPP 3장 완전 정복] 3.10 기계 수준 프로그램에서 제어와 데이터는 어떻게 결합될까? (0) | 2025.04.09 |
[CSAPP 3장 완전 정복] 3.9 구조체는 메모리에서 어떻게 저장될까? (0) | 2025.04.08 |