[CSAPP 7장 완전 정복] 7.1~7.2 컴파일러 드라이버와 정적 링킹

2025. 4. 17. 16:07·크래프톤 정글/컴퓨터구조(CSAPP)

컴파일러 드라이버와 정적 링킹

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
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다
  • [CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일
  • [CSAPP 3장 완전 정복] 3.11 부동소수점 연산은 어떻게 이루어질까?
  • [CSAPP 3장 완전 정복] 3.10 기계 수준 프로그램에서 제어와 데이터는 어떻게 결합될까?
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리) N
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이) N
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 7장 완전 정복] 7.1~7.2 컴파일러 드라이버와 정적 링킹
상단으로

티스토리툴바