어셈블리 단계 (Assembly)
컴파일 단계에서 생성된 어셈블리 코드를 실제 CPU가 실행 가능한 기계어(바이너리 코드)로 변환하는 과정
- 어셈블리 코드를 기계어로 변환함
- 오브젝트 파일(
.o,.obj) 생성 - 심볼 테이블(Symbol Table) 생성
- 재배치 정보(Relocation) 생성
어셈블러 (Assembler)
어셈블리 코드를 기계어로 변환하는 프로그램
어셈블리어 → 기계어
변환 수행
어셈블러의 역할
- 어셈블리 명령어를 CPU 아키텍처에 맞는 기계어로 변환
- 코드와 데이터를 섹션 단위로 분리
- 심볼 테이블 생성
- 재배치 정보 생성
섹션 (Section)
오브젝트 파일 내부에서 코드와 데이터를 구분하는 영역
| 섹션 | 역할 |
|---|---|
.text |
실행 코드 저장 |
.data |
초기화된 전역 변수 저장 |
.bss |
초기화되지 않은 전역 변수 저장 |
.rodata |
읽기 전용 데이터 저장 |
심볼 테이블 (Symbol Table)
함수와 변수 정보를 저장하는 테이블
예시:
void Attack()
{
}
↓
심볼:
Attack
오프셋 (Offset)
어셈블리 단계에서는 아직 실제 메모리 주소가 정해지지 않음
- 아직 링크 단계가 끝나지 않았고
- 프로그램이 메모리 어디에 배치될지도 모르기 때문
그래서 함수나 변수의 위치를 실제주소 대신 섹션 내부 기준 상대 위치에 저장함
이 상대 위치 값을 오프셋(Offset)이라고 함
예시
.text 섹션
0byte : Move()
20byte : Attack()
50byte : Jump()
여기서 Attack()의 오프셋은: 20byte (.text 시작 기준 +20byte 위치)
이후 링크 단계
링커가 실제 .text 시작 주소를 결정한 뒤:
실제 주소 = 섹션 시작 주소 + 오프셋
형태로 최종 주소를 계산함
재배치 정보 (Relocation)
외부 함수나 다른 파일의 변수를 사용할 경우 실제 주소를 아직 알 수 없음
예시:
extern void Attack();
Attack();
현재는 Attack()의 실제 주소를 모르기 때문에:
"나중에 실제 주소로 수정 필요"
라는 정보를 저장함
이를 재배치 정보(Relocation)라고 함
오브젝트 파일의 구성 요소
어셈블리 단계에서 생성된 오브젝트 파일에는:
| 구성 요소 | 설명 |
|---|---|
| 기계어 코드 | CPU 실행 코드 |
| 섹션 정보 | .text, .data 등 |
| 심볼 테이블 | 함수/변수 이름 정보 |
| 재배치 정보 | 나중에 주소 수정이 필요한 위치 |
특징
- 오브젝트 파일은 아직 실행 파일이 아님
- 실제 메모리 주소가 확정되지 않은 상태
- 외부 심볼 연결도 아직 완료되지 않음
- 이후 링크(Link) 단계에서 최종 연결 수행
핵심 요약
- 어셈블리 단계는 어셈블리어를 기계어로 변환하는 과정
- 결과로 오브젝트 파일(
.o,.obj) 생성 - 오브젝트 파일에는 기계어뿐 아니라 심볼 테이블과 재배치 정보도 포함됨
- 실제 주소 연결은 아직 완료되지 않은 상태
- 이후 링크 단계에서 최종 실행 파일로 연결됨