[CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일

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

오브젝트 파일과 재배치 가능 오브젝트 파일

저번 글에서 정적 링크가 .o 파일들을 하나의 실행파일로 묶는다는 것을 알 수 있었는데요. 그렇다면 이 .o 파일 내부에는 무엇이 들어 있고, 링커는 그것을 어떻게 활용하는 걸까요?

 

이번 글에서는 CSAPP 7.3~7.4절 내용을 기반으로, 오브젝트 파일의 구조(ELF)와 재배치 가능 오브젝트 파일 개념을 이해하고, 링커가 파일들을 어떻게 처리하는지 내부적으로 파헤쳐봅니다.

 

 

7.3 오브젝트 파일의 구조, ELF 포맷 살펴보기

대부분의 유닉스 기반 시스템에서 오브젝트 파일은 ELF(Executable and Linkable Format) 구조를 따릅니다. 오브젝트 파일은 단순한 바이너리 덩어리가 아니라, 아래와 같이 각기 다른 섹션(Section)으로 이루어진 정형화된 구조입니다.

섹션 설명
.text 실제 코드 (기계어)
.data 초기화된 전역 변수
.bss 초기화되지 않은 전역 변수
.rodata 읽기 전용 데이터 (문자열 상수 등)
.symtab 심볼 테이블
.rel.text, .rel.data 재배치 정보

그리고 실제 오브젝트 파일 구조를 보는 명령어는 다음과 같습니다.

readelf -S main.o        # 섹션 헤더 보기
readelf -s main.o        # 심볼 테이블 보기
objdump -d main.o        # 기계어->어셈블리

책에서는 .text, .data, .bss 구조를 그림과 함께 설명하고, 변수와 함수가 어느 섹션에 들어가는지를 사례 중심으로 보여줍니다.

 

 

7.4 나중에 주소를 정하는 '재배치 가능 오브젝트 파일'

링커가 .o 파일을 연결할 때, 가장 중요한 일 중 하나는 주소 할당입니다. 그런데 .o 파일에는 아직 주소가 정해져 있지 않아, '주소 할당이 중요하다'는 말이 무색해 보일 수도 있습니다. 왜 그런 것일까요?

 

바로 목적 파일은 다른 파일들과 함께 링크될지도 모르는 상태에서 만들어지기 때문인데요. 그래서 내부에서는 심볼 이름이나 상대 오프셋으로만 참조를 진행합니다. 그리고 진짜 주소는 링커가 모든 파일을 보고 난 뒤에 배정하게 되죠. .o 파일처럼 주소가 정해지지 않고 나중에 링크 시 결정되는 파일을 재배치 가능한 오브젝트 파일(Relocatable Object File)이라고 합니다.

 

그렇다면 왜 재배치가 필요한 것일까요? 그 이유는 코드 안에 함수 호출이나 변수 참조가 있을 때, 그게 정확히 어디에 있는 주소인지 아직 모르는 상태이기 때문입니다. 대신, '이 위치는 나중에 주소로 채워야 한다'는 표시만 남겨둡니다. 이 표시가 바로 .rel.text, .rel.data에 저장되는 재배치 정보(Relocation Entry)입니다.

 

각 재배치 항목에는 실제로 다음과 같은 정보가 담겨 있습니다:

  • Offset: 주소를 채워야 할 위치
  • Symbol: 참조하고 있는 함수나 변수 이름
  • Type: 어떤 방식으로 주소를 채울 것인지의 유형

예를 들어 위의 sum() 호출은 .rel.text 섹션에 다음과 같이 표시될 수 있습니다:

OFFSET   TYPE              SYMBOL
0000001e R_X86_64_PC32     sum

이 의미는 "텍스트 섹션의 0x1e 위치에서 sum이라는 심볼을 참조하고 있으니, 나중에 sum의 실제 주소로 채워라"는 뜻입니다.이때 링커는 .rel.text에 있는 각 재배치 항목을 순회하면서, 심볼 테이블(.symtab)에서 해당 심볼의 정의를 찾아 실제 주소를 결정합니다.

 

이러한 재배치 정보를 볼 수 있는 명령어는 다음과 같습니다.

readelf -r main.o       # 재배치 정보 보기

 

이어서 예시 흐름을 한 번 따라가 보겠습니다.

// main.c
extern int sum(int, int);

int main() {
    return sum(1, 2);
}

이 C 파일을 컴파일하면 main.o에는 다음과 같은 정보들만 가지고 있게 됩니다.

  • sum()이라는 외부 함수 심볼을 참조하고 있다는 것
  • 어느 위치에서 호출하고 있는지를 기록하고 있다는 것
  • 하지만 해당 함수의 실제 주소는 아직 비어 있음 -> 재배치 필요(relocation needed)

이 정보들이 .rel.text에 기록되어, 링커가 최종 실행파일을 만들 때 이 빈 주소에 sum의 실제 주소를 넣게 됩니다.

 

 

핵심 정리

  • ELF는 오브젝트 파일과 실행파일의 표준 구조이다.
  • 섹션(.text, .data 등)은 코드와 데이터를 논리적으로 나눠서 저장한다.
  • 재배치 가능 오브젝트 파일은 주소가 아직 결정되지 않은 상태의 목적 파일이다.
  • 재배치 정보(Relocation Entry)는 나중에 주소를 넣어야 할 위치와 심볼 정보를 저장한 항목이다.
저작자표시 비영리 변경금지 (새창열림)

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

[CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다  (0) 2025.04.17
[CSAPP 7장 완전 정복] 7.1~7.2 컴파일러 드라이버와 정적 링킹  (0) 2025.04.17
[CSAPP 3장 완전 정복] 3.11 부동소수점 연산은 어떻게 이루어질까?  (0) 2025.04.09
[CSAPP 3장 완전 정복] 3.10 기계 수준 프로그램에서 제어와 데이터는 어떻게 결합될까?  (0) 2025.04.09
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩
  • [CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다
  • [CSAPP 7장 완전 정복] 7.1~7.2 컴파일러 드라이버와 정적 링킹
  • [CSAPP 3장 완전 정복] 3.11 부동소수점 연산은 어떻게 이루어질까?
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기
      • 크래프톤 정글
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일
상단으로

티스토리툴바