개요
ELF(Executable and Linkable Format) 파일 형식은 유닉스 계열 운영 체제에서 실행 파일, 공유 라이브러리, 커널 모듈, 코어 덤프 등을 저장하기 위해 채택된 표준 파일 포맷이다. 현재 대부분의 리눅스 배포판, BSD 계열, 그리고 일부 임베디드 시스템에서 사용되고 있다.
역사
ELF는 1990년대 초에 System V Release 4 (SVR4)에서 기존 a.out 포맷을 대체하기 위해 도입되었다. 이후 1995년 AT&T가 정의한 “Executable and Linkable Format (ELF) Specification”이 공개되었으며, 이 사양은 현재까지 IEEE와 OSF(Open Software Foundation)에서 관리·업데이트하고 있다.
구조
ELF 파일은 크게 다음과 같은 영역으로 구성된다.
| 영역 | 설명 |
|---|---|
| ELF 헤더 | 파일 전체에 대한 메타데이터(파일 클래스, 엔디언, 오프셋, 엔트리 포인트 등)를 포함한다. |
| 프로그램 헤더 테이블 | 실행 시 로더가 필요한 메모리 매핑 정보를 제공한다(로드 가능한 세그먼트, 권한, 파일 오프셋 등). |
| 섹션 헤더 테이블 | 링크 단계에서 사용되는 각 섹션(코드, 데이터, 심볼, 재배치 등)의 정보를 담는다. |
| 섹션들 | 실제 내용이 저장되는 영역. 주요 섹션으로는 .text(코드), .data(초기화된 데이터), .bss(초기화되지 않은 데이터), .rodata(읽기 전용 데이터), .symtab(심볼 테이블), .rel/.rela(재배치 정보) 등이 있다. |
| 스트링 테이블 | 섹션 이름, 심볼 이름 등 문자열을 저장한다. |
주요 특징
- 플랫폼 독립성
- 32비트(ELF32)와 64비트(ELF64) 두 가지 클래스를 지원하며, 리틀 엔디언과 빅 엔디언 모두에 대해 정의가 존재한다.
- 동적 링크 지원
- 동적 심볼 테이블(.dynsym)과 PLT(Procedure Linkage Table), GOT(Global Offset Table) 등을 통해 런타임에 공유 라이브러리를 연결한다.
- 확장성
- 새로운 섹션이나 헤더 타입을 추가할 수 있도록 설계돼 있어, 다양한 확장(예: 디버깅 정보를 위한 .debug_* 섹션, 보안 확장을 위한 .note.gnu.property 등)이 가능하다.
- 표준화
- 현재 ELF 사양은 “ELF Specification Version 1.2”를 기반으로 하며, GNU binutils, LLVM, glibc 등 주요 툴 체인에서 구현된다.
사용 사례
- 리눅스 실행 파일:
/bin/ls,/usr/bin/bash등 대부분의 실행 파일이 ELF 형식이다. - 공유 라이브러리:
libc.so.6,libm.so.6등은 ELF 공유 객체(.so) 형태로 제공된다. - 커널 모듈: 리눅스 커널에 로드되는 모듈(
.ko파일)도 ELF 구조를 따른다. - 코어 덤프: 프로그램이 비정상 종료했을 때 생성되는 코어 파일 역시 ELF 형식이다.
표준 문서 및 참고
- Executable and Linkable Format (ELF) Specification, Version 1.2, IEEE Std 1275-1994 및 System V ABI.
- ELF Handling For Fun and Profit (Linux Documentation Project) – 실용적인 분석 예시 제공.
- GNU Binutils 매뉴얼 –
readelf,objdump등 ELF 파일을 다루는 도구 설명.
해당 내용은 공개된 표준 문서와 널리 사용되는 운영 체제·툴 체인에서 확인된 정보를 기반으로 작성되었다.