컴퓨터 시스템 7장-링커(Linking) 1-1
2025. 4. 19. 10:21ㆍ개념 공부
7.1 프로그램이 만들어지는 과정
- 전처리기 (cpp):
#include,#define같은 전처리 명령 처리
➜ 결과 파일:hello.i - 컴파일러 (cc1): 전처리된 코드를 어셈블리 코드로 변환
➜ 결과 파일:hello.s - 어셈블러 (as): 어셈블리 코드를 기계어로 바꿔 오브젝트 파일 생성
➜ 결과 파일:hello.o - 링커 (ld): 오브젝트 파일들을 묶어 실행 가능한 프로그램 생성
➜ 결과 파일:hello(실행 파일)
7.2 링커가 하는 일
입력: 여러 개의 .o (오브젝트 파일)
- 각 파일은 기계어 코드지만, 독립적이라 단독 실행 불가
- 전역 함수, 전역 변수 등의 정보가 심볼 테이블에 들어 있음
링커의 두 가지 핵심 작업
- 심볼 해결 (Symbol Resolution)
- 함수/변수 이름을 기준으로 정의된 심볼을 찾아 연결
- 예:
p1.o에서foo()를 호출 → 정의는p2.o에 있을 수 있음
- 재배치 (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키워드랑 같이 사용
링커가 심볼 테이블을 쓰는 방법
- 모든 오브젝트 파일의 심볼 테이블을 읽음
- 같은 이름의 심볼들을 정리
- 정의된 심볼 → 위치 기록
- 외부 심볼 → 정의된 걸 찾아서 연결
- → 함수/변수들이 서로 잘 연결되도록 주소를 연결해 줌
심볼 속성들
- UNDEF (Undefined)
- 다른 파일에서 정의됨
- 이 파일에서는 참조만 함
- 예:
printf,malloc등
- COMMON
- 초기화 안 한 전역 변수 (ex:
int x;) - → 링커가
.bss에 넣고, 같은 이름이면 하나로 합쳐줌
- 초기화 안 한 전역 변수 (ex:
힌트
int x;→ COMMONint x = 0;→ .data
요약
- 심볼 = 이름 붙은 코드/데이터
- 심볼 테이블 = 그 이름들이 어디 있는지 정리한 주소록
- 링커 = 그 주소록을 보고 파일들을 하나로 엮는 중개자
'개념 공부' 카테고리의 다른 글
| 컴퓨터 시스템 8장 시그널 (0) | 2025.04.21 |
|---|---|
| 컴퓨터 시스템 7장-링커(Linking) 1-2 (0) | 2025.04.19 |
| 포인터 (0) | 2025.04.14 |
| 컴퓨터 시스템에서의 가상화 (1) | 2025.04.12 |
| CS:APP 3장 – 기계 수준 프로그램 표현 (중요 개념 정리) (0) | 2025.04.09 |