ELF 파일 형식

ELF 파일은 두 관점을 갖는다: 프로그램 헤더는 런타임 시 사용되는 세그먼트들을 보여주고, 섹션 헤더는 바이너리의 섹션들의 집합을 나열한다.

ELF(Executable and Linkable Format)는 실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다. 1999년 86open 프로젝트에 의해 x86 기반 유닉스, 유닉스 계열 시스템들의 표준 바이너리 파일 형식으로 선택되었다.

파일 레이아웃

[편집]

각 ELF 파일은 하나의 ELF 헤더와 파일 데이터로 이루어진다. 파일 데이터는 다음을 포함한다.

  • 0개 또는 그 이상의 세그먼트들을 정의하는 프로그램 헤더 테이블
  • 0개 또는 그 이상의 섹션들을 정의하는 섹션 헤더 테이블
  • 프로그램 헤더 테이블 또는 섹션 헤더 테이블의 엔트리들에 의해 참조되는 데이터

섹션들이 링킹과 재배치에 필요한 중요한 정보를 포함하는 반면, 세그먼트들은 파일의 런타임 실행에 필요한 정보를 포함한다. 전체 파일의 어떤 바이트도 최대 한 개의 섹션에 의해 소유될 수 있으며 어떠한 섹션에 의해서도 소유되지 않은 고아 바이트들이 존재할 수 있다.

파일 헤더

[편집]

ELF 파일 헤더는 32비트 또는 64비트 주소들이 사용되어야 하는지를 정의한다.

ELF 헤더[1]
오프셋 크기(Bytes) 필드 목적
32-bit 64-bit 32-bit 64-bit
0x00 4 e_ident[EI_MAG0]부터 e_ident[EI_MAG3] 0x7FASCII 코드 ELF; 이 네 바이트가 매직 넘버를 형성한다.
0x04 1 e_ident[EI_CLASS] 이 바이트는 1 또는 2로 설정되며 32비트 또는 64비트 형식을 나타낸다.
0x05 1 e_ident[EI_DATA] 이 바이트는 1 또는 2로 설정되며 리틀 또는 빅엔디언을 나타낸다.
0x06 1 e_ident[EI_VERSION] 오리지널 버전의 ELF인 경우 1로 설정된다.
0x07 1 e_ident[EI_OSABI] 대상 운영 체제 ABI를 구별한다..
ABI
0x00 System V
0x01 HP-UX
0x02 NetBSD
0x03 리눅스
0x06 솔라리스
0x07 AIX
0x08 IRIX
0x09 FreeBSD
0x0C OpenBSD
0x0D OpenVMS

이것은 대상 플랫폼과 관련 없이 종종 0으로 설정된다.

0x08 1 e_ident[EI_ABIVERSION] ABI 버전을 더 명시한다. 이 해석은 대상 ABO에 따라 달라진다. 2.6 버전 이후의 리눅스 커널은 이것을 정의하지 않는다.[2] 이 경우 오프셋과 크기는 8이다.
0x09 7 e_ident[EI_PAD] 현재 사용하지 않음
0x10 2 e_type 1, 2, 3, 4는 각각 재배치, 실행, 공유 그리고 코어를 명시한다.
0x12 2 e_machine 대상 명령어 집합을 명시한다. 예를 들면:
ISA
0x00 특정한 명령어 집합 없음
0x02 SPARC
0x03 x86
0x08 MIPS
0x14 파워PC
0x28 ARM
0x2A 슈퍼H
0x32 IA-64
0x3E x86-64
0xB7 AArch64
0x14 4 e_version 오리지날 버전의 ELF인 경우 1로 설정된다.
0x18 4 8 e_entry 이것은 엔트리 포인트의 메모리 주소이다. 즉 프로세스가 어디서 실행을 시작하는지를 말해준다. 이 필드는 위에서 정의한 32비트 또는 64비트에 따라 길이가 다르다.
0x1C 0x20 4 8 e_phoff 프로그램 헤더 테이블의 시작을 가리킨다.
0x20 0x28 4 8 e_shoff 섹션 헤더 테이블의 시작을 가리킨다.
0x24 0x30 4 e_flags 대상 아키텍처에 따라 이 필드의 해석이 달라진다.
0x28 0x34 2 e_ehsize 이 헤더의 크기를 가지며 일반적으로 64비트의 경우 64바이트, 32비트의 경우 52바이트이다.
0x2A 0x36 2 e_phentsize 프로그램 헤더 테이블 엔트리의 크기를 갖는다.
0x2C 0x38 2 e_phnum 프로그램 헤더 테이블에서 엔트리의 개수.
0x2E 0x3A 2 e_shentsize 섹션 헤더 테이블 엔트리의 크기를 갖는다.
0x30 0x3C 2 e_shnum 섹션 헤더 테이블에서 엔트리의 개수.
0x32 0x3E 2 e_shstrndx 섹션 이름들을 포함하는 섹션 헤더 테이블 엔트리의 인덱스.

도구

[편집]
  • readelf는 하나 이상의 ELF 파일들에 대한 정보를 보여주는 유닉스 바이너리 유틸리티이다.
  • elfutils는 순수하게 리눅스를 위한 대체 도구들을 제공한다. [3]
  • elfdump 는 ELF 파일에서 ELF 정보를 보기 위한 명령어로서 솔라리스와 FreeBSD에서 사용 가능하다.
  • objdump는 ELF 파일들과 다른 목적 포맷들에 대한 많은 정보를 제공한다. objdump는 ELF 데이터를 구조화하기 위해 바이너리 파일 디스크립터 라이브러리를 백엔드로서 사용한다.
  • 유닉스 file 유틸리티는 코드의 명령어 집합을 포함한 ELF 파일들에 대한 몇몇 정보를 보여줄 수 있다.

적용

[편집]

ELF 형식은 다양한 환경들에서 오래된 실행 파일 포맷을 대체했다. 이것은 유닉스 계열 운영체제에서 a.outCOFF 포맷을 대체하였다.

ELF는 또한 유닉스 계열이 아닌 운영체제에서도 채택되었다.

몇몇 게임 콘솔들도 또한 ELF를 사용한다.

같이 보기

[편집]

각주

[편집]
  1. “ELF Header”. Sco.com. July 2000. 2016년 2월 11일에 확인함. 
  2. “LXR linux/include/linux/elf.h”. 《linux.no》. 2015년 4월 27일에 확인함. 
  3. “elfutils”. 《fedorahosted.org》. 2015년 12월 26일에 원본 문서에서 보존된 문서. 2015년 4월 27일에 확인함. 
  4. “MinixReleases - Minix Wiki”. Wiki.minix3.org. 2013년 1월 18일에 원본 문서에서 보존된 문서. 2016년 2월 11일에 확인함. 
  5. “GCCSDK - RISC OS”. Riscos.info. 2012년 4월 22일. 2014년 2월 19일에 원본 문서에서 보존된 문서. 2016년 2월 11일에 확인함. 
  6. PlayStation Portable use encrypted & relocated ELF: PSP