[CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩

2025. 4. 18. 11:09·크래프톤 정글/컴퓨터구조(CSAPP)

링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩

지금까지 링커가 .o 파일을 어떻게 연결하는지를 배웠다면, 이제는 이 파일들이 어떻게 하나의 실행 파일로 완성되는지, 그리고 운영체제가 그 실행 파일을 어떻게 실행시키는지를 알아야 할 차례입니다.

 

이번 글에서는 CSAPP 7.7~7.9절 내용을 바탕으로 재배치(relocation), 실행 가능 목적 파일 생성, 로더에 의한 메모리 적재 과정을 시스템 수준해서 연결해 정리해보겠습니다.

 

 

7.7 주소를 완성하는 마지막 단계, 재배치(Relocation)

.o 파일은 아직 주소가 비어있는 재배치 가능한 파일(Relocatable Object File)인데요. 링커는 이 파일들을 하나로 묶으면서 각 심볼의 실제 메모리 주소를 확정하고, 그에 따라 코드 내부의 참조값을 수정하는 작업을 수행합니다. 이 과정이 바로 재배치인 것이죠.

재배치의 대상

  • 함수 호출 주소 (call sum 등)
  • 전역 변수 참조 (movq x, %rax)
  • 정적 데이터 참조 (.data 섹션 내부 포인터 등)

재배치 정보를 담고 있는 섹션들

  • .rel.text: .text 섹션 내의 재배치 항목
  • .rel.data: .data 섹션 내의 재배치 항목

재배치 항목을 확인하는 명령어는 다음과 같습니다.

readelf -r main.o  # 재배치 항목 확인

이 작업이 완료되어야만 비로소 실행 가능한 코드가 될 수 있습니다.

 

 

7.8 링커의 최종 산출물, 실행 가능 목적 파일

재배치를 완료한 뒤, 링커는 실행 가능 목적 파일(Executable Object File)을 만들게 되는데요. 보통 이 파일은 ELF 포맷을 따르고, 다음과 같은 주요 섹션이 포함됩니다.

ELF 세그먼트 설명
.text 기계어 명령어
.data 초기화된 데이터
.bss 초기화되지 않은 데이터
.rodata 읽기 전용 데이터
Entry point 실행 시작 위치 (main 이전 코드 포함)

위의 정보를 알 수 있는 명령어는 다음과 같습니다.

readelf -h prog       # ELF 헤더 정보
readelf -l prog       # 메모리 배치 정보

실행 가능 목적 파일에는 프로그램이 메모리에 적재될 때의 주소와 크기 정보가 포함되어 있고, OS는 이 정보를 기반으로 메모리에 코드를 배치합니다.

 

 

7.9 OS의 실행 가능 목적 파일 로딩

링커가 실행 가능 목적 파일을 만들었다면, 그 다음은 OS의 로더(loader)가 이 파일을 실행하는 단계입니다.

OS 로딩 과정 개요

  1. 실행 가능 목적 파일(ELF)을 열고 ELF 헤더를 읽는다.
  2. 프로그램 헤더를 따라 각 섹션을 메모리로 복사한다. (.text, .data, .bss, .rodata 등)
  3. 메모리에서 스택(stack), 힙(heap) 영역을 초기화한다.
  4. entry point로 jump한다. (보통 main() 이전의 _start 함수로 점프하게 됨)

사용자가 ./prog 라고 실행하는 순간, 이 모든 일이 자동으로 벌어지는 것이죠. 아래의 명령어를 통해 해당 과정을 추적할 수 있습니다.

strace ./prog    # OS가 open, mmap, execve 등을 호출하는 과정 추적

 

재배치 가능 목적 파일~로딩 예시 흐름 정리

아래의 C 코드가 실행되는 과정을 정리하면 다음과 같습니다.

int main() {
  return sum(1, 2);
}
  1. main.o, sum.o 생성 (재배치 가능 목적 파일로, 아직 주소가 정해지지 않은 상태)
  2. 링커가 .rel.text 등 재배치 정보를 기반으로 주소 결정
  3. 실행 가능 목적 파일(prog)를 생성 (여기에는 entry point 등이 포함)
  4. OS가 실행 가능 목적 파일을 메모리에 적재, main() 실행 시작

 

핵심 요약

  • 재배치는 심볼의 주소를 결정하고 코드 내 참조를 수정하는 과정
  • 실행 가능 목적 파일은 완성된 ELF 바이너리 파일로, entry point를 포함한다
  • 로딩은 OS가 ELF를 메모리에 올리고, main() 이전 코드를 실행하는 과정이다
저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글

[CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다  (0) 2025.04.17
[CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일  (0) 2025.04.17
[CSAPP 7장 완전 정복] 7.1~7.2 컴파일러 드라이버와 정적 링킹  (0) 2025.04.17
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT
  • [CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식
  • [CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다
  • [CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기
      • 크래프톤 정글
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무)
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩
상단으로

티스토리툴바