
출처 : https://www.ics.uci.edu/~aburtsev/238P/hw/hw3-elf/hw3-elf.html
ELF(Executable and Linkable Format) 파일은 리눅스 및 유닉스 계열 운영 체제에서 사용되는 실행 파일, 공유 라이브러리 및 오브젝트 파일의 표준 형식이다. ELF 파일의 첫 번째 부분은 ELF 헤더로, 파일의 구조와 해석 방법을 정의하는 정보를 포함하고 있다.
ELF 헤더의 주요 구성 요소 (readelf -h)
- Magic Number: ELF 파일임을 나타내는 고유한 서명(\x7fELF).
- 클래스(Class): 파일의 주소 크기를 나타낸다. ELFCLASS32는 32비트, ELFCLASS64는 64비트 파일임을 의미한다.
- 데이터 인코딩(Data Encoding): 파일의 바이트 순서를 나타낸다. 리틀 엔디안(LE) 또는 빅 엔디안(BE)일 수 있다.
- ELF 버전: 파일 형식의 버전을 나타낸다.
- OS/ABI: 파일이 사용하는 운영 체제 및 ABI(Application Binary Interface)를 지정한다.
- 파일 타입: ELF 파일이 실행 파일, 오브젝트 파일, 공유 라이브러리 파일 중 어떤 것인지 나타낸다.
- 머신 타입: 이 파일이 어떤 프로세서 아키텍처에서 실행될 수 있는지 정의한다.
- 엔트리 포인트(Entry Point): 프로그램이 시작되는 메모리 주소를 나타낸다.
- 프로그램 헤더 테이블 오프셋: 프로그램 헤더 테이블의 위치를 나타내며, 이를 통해 실행 가능한 섹션을 메모리에 매핑한다.
- 섹션 헤더 테이블 오프셋: 섹션 헤더 테이블의 위치를 나타내며, 각 섹션의 속성과 위치 정보를 포함한다.
- 헤더 크기: ELF 헤더의 크기(바이트 단위)
ELF 섹션 헤더는 ELF 파일의 각 섹션에 대한 정보를 포함하는 구조체이다. 프로그램이 실행될 때, 각각의 섹션은 특정한 용도를 가지며, 이 섹션들은 파일 내에서 어떻게 배치되고, 메모리에 어떻게 로드될지에 대한 정보를 담고 있다.
ELF 섹션 헤더의 주요 구성 요소 (readelf -S)
- 섹션 이름: 섹션의 이름 또는 인덱스를 나타낸다.
- 섹션 타입: 섹션의 유형을 지정하며, SHT_PROGBITS(일반적인 데이터), SHT_SYMTAB(심볼 테이블), SHT_NOBITS(메모리에만 존재하는 데이터) 등이 있다.
- 섹션 플래그: 섹션의 속성을 정의하며, 읽기, 쓰기, 실행 가능 여부를 나타낸다.
- 섹션 주소: 섹션이 메모리에 로드될 때의 주소를 나타낸다.
- 섹션 오프셋: 섹션이 파일 내에서 시작되는 위치를 나타낸다.
- 섹션 크기: 섹션의 크기를 나타낸다.
- 링크: 섹션이 참조하는 다른 섹션에 대한 링크를 포함할 수 있다.
- 섹션 정렬: 섹션이 메모리에서 어떻게 정렬될지를 정의한다.
섹션 헤더 테이블을 통해 운영 체제는 ELF 파일의 다양한 섹션을 이해하고 적절히 처리할 수 있다. 예를 들어, .text 섹션은 프로그램의 실행 코드가 저장된 영역이며, .data 섹션은 초기화된 전역 변수와 정적 변수가 저장된 영역이다.
ELF 프로그램 헤더는 ELF 파일을 메모리에 매핑할 때 사용되는 정보를 담고 있다. 이 헤더는 실행 파일이 메모리에 어떻게 로드되고 실행되는지를 제어하며, 실행 시 필요한 메모리 공간을 정의한다.
ELF 프로그램 헤더의 주요 구성 요소
- 세그먼트 타입: 이 세그먼트가 메모리에 어떻게 매핑될지 지정한다. 예를 들어, PT_LOAD는 로드할 세그먼트임을 나타내며, PT_DYNAMIC은 동적 링킹 정보를 포함한 세그먼트를 나타낸다.
- 파일 오프셋: 파일에서 이 세그먼트의 시작 위치를 나타낸다.
- 가상 주소: 세그먼트가 메모리에 로드될 때 할당되는 가상 메모리 주소를 나타낸다.
- 물리 주소: 하드웨어에서 사용하는 실제 물리적 주소를 나타내지만, 일반적으로 가상 주소와 같거나 무시된다.
- 파일 크기: 파일 내에서 이 세그먼트가 차지하는 크기를 나타낸다.
- 메모리 크기: 메모리에 로드될 때 이 세그먼트가 차지할 크기를 나타낸다.
- 세그먼트 플래그: 세그먼트의 접근 권한을 나타낸다. 예를 들어, R(읽기), W(쓰기), X(실행) 플래그가 있다.
- 정렬: 세그먼트가 메모리에 로드될 때 어떻게 정렬될지를 지정한다.
프로그램 헤더는 ELF 파일이 메모리에 어떻게 배치되고, 실행되는지 결정하는 중요한 정보들을 포함한다. 프로그램 헤더를 통해 운영 체제는 프로그램의 실행을 위해 필요한 메모리 공간을 할당하고, 코드와 데이터를 올바르게 매핑할 수 있다.