컴퓨터 시스템 7장-링커(Linking) 1-1

2025. 4. 19. 10:21개념 공부

 7.1 프로그램이 만들어지는 과정

  1. 전처리기 (cpp): #include, #define 같은 전처리 명령 처리
    ➜ 결과 파일: hello.i
  2. 컴파일러 (cc1): 전처리된 코드를 어셈블리 코드로 변환
    ➜ 결과 파일: hello.s
  3. 어셈블러 (as): 어셈블리 코드를 기계어로 바꿔 오브젝트 파일 생성
    ➜ 결과 파일: hello.o
  4. 링커 (ld): 오브젝트 파일들을 묶어 실행 가능한 프로그램 생성
    ➜ 결과 파일: hello (실행 파일)

 7.2 링커가 하는 일

입력: 여러 개의 .o (오브젝트 파일)

  • 각 파일은 기계어 코드지만, 독립적이라 단독 실행 불가
  • 전역 함수, 전역 변수 등의 정보가 심볼 테이블에 들어 있음

 링커의 두 가지 핵심 작업

  1. 심볼 해결 (Symbol Resolution)
    • 함수/변수 이름을 기준으로 정의된 심볼을 찾아 연결
    • 예: p1.o에서 foo()를 호출 → 정의는 p2.o에 있을 수 있음
  2. 재배치 (Relocation)
    • 각 오브젝트 파일은 자기 주소 기준으로 작성됨
    • 그래서 전체 프로그램 주소에 맞게 주소들을 조정해줘야 함

 7.4 오브젝트 파일이란?

  • C 소스를 컴파일하면 기계어로 번역된 .o 파일이 생김
  • 이 파일은 단독 실행 불가 → 링커가 결합 후 실행 파일 생성
  • 그래서 재배치 가능 오브젝트 파일이라고 불림

 주요 섹션들

섹션 이름 내용 설명
.text 실제 실행되는 기계어 코드
.data 초기값이 있는 전역 변수
.bss 초기값이 없는 전역 변수
.rodata 읽기 전용 데이터 (ex: 문자열 상수)
.symtab 심볼 테이블 (함수/변수 이름 위치 정보)
.rel.text, .rel.data 재배치 정보 (주소를 나중에 수정해야 하는 위치)
.debug 디버깅 정보 (실행에는 불필요)

 왜 '재배치 가능'할까?

  • 오브젝트 파일은 전체 프로그램의 일부일 뿐
  • 다른 파일들과 합쳐질 때, .text / .data 섹션의 주소가 바뀌어야
  • 그래서 링커가 쉽게 처리할 수 있도록 재배치 정보 포함

예: printf("Hello")

  • 컴파일 시점에는 printf의 진짜 주소를 모름
  • 그래서 .rel.text에 "이 위치 나중에 채워줘"라고 기록함

.data와 .rel.data

구분 설명
.data 초기값 있는 전역 변수 저장 (ex: int x = 10;)
.rel.data .data 안에 주소 참조가 포함된 변수를 위한 재배치 정보
사용 시점 링커가 실행 파일 만들 때, .rel.data 참고해서 진짜 주소로 채움

 7.5 심볼과 심볼 테이블

1. 정의된 심볼 (Defined Symbol)

  • 자기 파일 안에서 정의된 함수/변수
  • 실제 메모리 공간 존재 (예: int x = 10;)
  • .text, .data 섹션 안에 들어 있음

2. 외부 심볼 (External Symbol)

  • 다른 파일에 정의돼 있고, 지금 이 파일에서 참조만
  • 예: printf() → libc에서 찾아 연결해야 함

3. 로컬 심볼 (Local Symbol)

  • 자기 파일에서만 쓰는 내부용 심볼
  • 보통 static 키워드랑 같이 사용

 링커가 심볼 테이블을 쓰는 방법

  1. 모든 오브젝트 파일의 심볼 테이블을 읽음
  2. 같은 이름의 심볼들을 정리
    • 정의된 심볼 → 위치 기록
    • 외부 심볼 → 정의된 걸 찾아서 연결
  3. → 함수/변수들이 서로 잘 연결되도록 주소를 연결해 줌

심볼 속성들

  • UNDEF (Undefined)
    • 다른 파일에서 정의됨
    • 이 파일에서는 참조만
    • 예: printf, malloc
  • COMMON
    • 초기화 안 한 전역 변수 (ex: int x;)
    • → 링커가 .bss에 넣고, 같은 이름이면 하나로 합쳐줌

 힌트

  • int x; → COMMON
  • int x = 0; → .data

요약

  • 심볼 = 이름 붙은 코드/데이터
  • 심볼 테이블 = 그 이름들이 어디 있는지 정리한 주소록
  • 링커 = 그 주소록을 보고 파일들을 하나로 엮는 중개자