ELF(Executable and Linkable Format)는 Linux 및 Unix 계열 시스템에서 실행 파일, 공유 라이브러리, 오브젝트 파일의 표준 형식이다. 바이너리 구조 분석, 리버스 엔지니어링, 동적 링킹의 기반이 된다.
ELF 구조
ELF 파일:
┌─────────────────────────┐
│ ELF Header │ 매직 넘버(7f 45 4c 46), 아키텍처, 진입점
├─────────────────────────┤
│ Program Header Table │ 실행 시 세그먼트 로딩 정보
├─────────────────────────┤
│ .text 섹션 │ 코드
│ .rodata 섹션 │ 읽기 전용 데이터 (문자열 상수 등)
│ .data 섹션 │ 초기화된 전역변수
│ .bss 섹션 │ 미초기화 전역변수 (파일에 공간 없음)
│ .symtab 섹션 │ 심볼 테이블
│ .dynamic 섹션 │ 동적 링킹 정보
│ .plt/.got 섹션 │ 프로시저 링킹 테이블
├─────────────────────────┤
│ Section Header Table │ 섹션 메타데이터
└─────────────────────────┘
분석 도구
bash
# ELF 헤더 확인
readelf -h /bin/ls
file /bin/ls
# 섹션 목록
readelf -S /bin/ls
objdump -h /bin/ls
# 심볼 테이블
readelf -s /bin/ls
nm /bin/ls
# 동적 의존성
ldd /bin/ls
readelf -d /bin/ls | grep NEEDED
# 역어셈블
objdump -d /bin/ls | head -50
PLT/GOT (동적 링킹)
printf() 호출 시:
1. PLT 엔트리 호출
2. GOT 확인 → 아직 해석 안 됐으면 링커 호출
3. 링커: 공유 라이브러리에서 printf 주소 찾아 GOT 업데이트
4. 이후 호출은 GOT 직접 참조
관련 개념