1. ELF Header의 역활
이 파일에 대한 메타 정보를 제공하는 역활을 합니다.
2. ELF Header의 파일에서의 위치
파일의 offset 0에 위치 합니다.
3. ELF를 구성하는구조체에 대하여 알아야 할 사항
[ 원문 ]
All data structures that the file format defines follow the "natural" size and alignment guidelines for the relevant class. If necessary, data structures contain explicit padding to ensure 4-byte alignment for 4-byte objects, to force structure sizes to a multiple of 4, etc.All data structures that the file format defines follow the "natural" size and alignment guidelines for the relevant class. If necessary, data structures contain explicit padding to ensure 4-byte alignment for 4-byte objects, to force structure sizes to a multiple of 4, etc.
The ELF header is described by the type Elf32_Ehdr or Elf64_Ehdr:
[ 한글 ]
파일 포맷을 정의하는 모든 데이터 구조체는 4byte 정렬을 따릅니다. 그래서 구조체가 4byte 정렬이 되지 않을 경우 패딩을 넣어 입으로 4byte 정렬을 구현 합니다.
그리고 ELF header는 운영체에 맞게 32bit Header(Elf32_Ehdr) 와 64bit Header(Elf64_Ehdr)가 존재 합니다.
* 구조체를 4byte로 정렬 하는 이유는 32bit cpu가 한번에 메모리에 가져올수 있는 데이터량이 32bit(=4byte)이기 때문 입니다. 그래서 효율성을 추구하는 프로그램에서는 4byte 메모리 정렬을 합니다.
4. ELF Header 구조체
1) ELF Header 구조체
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
ElfN_Addr e_entry;
ElfN_Off e_phoff;
ElfN_Off e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} ElfN_Ehdr;
5. ELF Header 구조체 멤버 설명
1) unsigned char e_ident[EI_NIDENT];
- EI_NIDENT 는 16 입니다.
[ 원문 ]
- this array of bytes specifies to interpret the file, independent of the processor or the file's remaining
contents.
- Within this array everything is named by macros, which start with the prefix EI_ and may contain
values which start with the prefix ELF.
- The following macros are defined:
[ 한글 ]
- e_ident에 기록된 정보를 통하여 파일을 해석 합니다. 그러나 프로세서 또는 파일의 나머지 내용과는 관련이 없습
니다.
- 배열 내에서의 위치는 접두사 EI로 시작하는 값으로 위치를 지정 하며, ELF접두사로 시작하는 값으로 배열을 값을
채웁니다.
- e_ident와 관련된 macro 들의 정의는 다음과 같습니다.
(1) e_indent의 array의 index별 설명
index marco |
index marco 값 |
index 별 설명 | index별 사용가능한 marco | index별 사용가능한 marco 설명 |
EI_MAG0 | 0 | magic number (0x7f) | ELFMAG0 | magic 값 0x7f |
EI_MAG1 | 1 | magic number (E) | ELFMAG1 | magic 값 E |
EI_MAG2 | 2 | magic number (L) | ELFMAG2 (L) | magic 값 L |
EI_MAG3 | 3 | magic number (F) | ELFMAG3 (F) | magic 값 F |
EI_CLASS |
4 | 이 바이너리의 아키텍처를 식별합니다 |
ELFCLASSNONE | This class is invalid |
ELFCLASS32 | 32-bit architecture | |||
ELFCLASS64 | 64-bit architecture | |||
EI_DATA |
5 | 프로세서 별 사용하는 data encoding을 지정합니다. |
ELFDATANONE | Unknown data format. |
ELFDATA2LSB | 2의 보수 , little-endian. | |||
ELFDATA2MSB | 2의 보수, big-endian. | |||
EI_VERSION |
6 | ELF 명세서 버전 | EV_NONE | Invalid version |
EV_CURRENT | Current version | |||
EI_OSABI |
7 | 객체가 대상으로하는 운영 체제와 ABI를 명시 합니다. | ELFOSABI_NONE | Same as ELFOSABI_SYSV |
ELFOSABI_SYSV | UNIX System V ABI. | |||
ELFOSABI_HPUX | HP-UX ABI. | |||
ELFOSABI_NETBSD | NetBSD ABI. | |||
ELFOSABI_LINUX | Linux ABI. | |||
ELFOSABI_SOLARIS | Solaris ABI. | |||
ELFOSABI_IRIX | IRIX ABI. | |||
ELFOSABI_FREEBSD | FreeBSD ABI. | |||
ELFOSABI_TRU64 | TRU64 UNIX ABI. | |||
ELFOSABI_ARM | ARM architecture ABI. | |||
ELFOSABI_STANDALONE | standalone (embedded) ABI | |||
EI_ABIVERSION | 8 |
개체가 대상으로하는 ABI의 버전을 식별합니다. 이 필드는 호환되지 않는 ABI 버전을 구별하는 데 사용됩니다. 이 버전 번호의 해석은 EI_OSABI 필드로 식별 된 ABI에 따라 다릅니다. 이 사양을 따르는 응용 프로그램은 0 값을 사용합니다 |
||
EI_PAD | 9 | 패딩의 시작을 표시 | 0 | e_indent의 배열 끝까지 0으로 채웁니다. |
2) e_type
- 파일의 type을 명시 합니다.
Macro | 설명 |
ET_NONE | An unknown type. |
ET_REL | A relocatable file. |
ET_EXEC | An executable file. |
ET_DYN | A shared object. |
ET_CORE | A core file. |
3) e_machine
- 이 파일을 사용하기 위해서 필요한 architecture정보를 나타 냅니다.
Macro | 설명 |
EM_NONE | An unknown machine. |
EM_M32 | AT&T WE 32100. |
EM_SPARC | Sun Microsystems SPARC. |
EM_386 | Intel 80386. |
EM_68K | Motorola 68000. |
EM_88K | Motorola 88000. |
EM_860 | Intel 80860. |
EM_MIPS | MIPS RS3000 (big-endian only). |
EM_PARISC | HP/PA. |
EM_SPARC32PLUS | SPARC with enhanced instruction set. |
EM_PPC | PowerPC. |
EM_PPC64 | PowerPC 64-bit. |
EM_S390 | IBM S/390 |
EM_ARM | Advanced RISC Machines |
EM_SH | Renesas SuperH |
EM_SPARCV9 | SPARC v9 64-bit. |
EM_IA_64 | Intel Itanium |
EM_X86_64 | AMD x86-64 |
EM_VAX | DEC Vax. |
4) e_version
- Object 파일의 버전 정보를 나타낸다.
Macro | 설명 |
EV_NONE | Invalid version |
EV_CURRENT | Current version |
5) e_entry
- 시스템이 실행하기 위해서 제어를 옮길때 어디로 옮겨야 하는지를 가르쳐주는 가상주소를 가진다. 만약 파일이 진입점(entry point)를 가지지 않는다면 0을 가집니다.
6) e_phoff
- program header table의 file offset을 byte단위로 나타낸다. 프로그램 헤더 테이블이 없다면 당연히 0을 가집니다.
7) e_shoff
- Section Header Table의 file offset을 byte단위로 나타낸다. 역시 섹션 헤더 테이블을 가지지 않는다면 0을 가집니다.
8) e_flags
- 파일과 관련되서 프로세서-스펙 flag를 가진다. flag을 나타내는 형태는 EF_[machine_flag]이 될 것이다. 현재는 정의도니 것이 없습니다.
9) e_ehsize
- ELF Header의 크기를 byte로 나타 냅니다.
10) e_phentsize
- 파일의 program header table에서 한 항목의 크기를 바이트 단위로 유지합니다. 모든 항목은 같은 크기입니다.
11) e_phnum
- program header table의 개수를 나타 냅니다. 따라서, 전체 프로그램 헤더 테이블의 크기는 앞에 나온 e_phentsize와 e_phnum의 곱이 될 것 입니다. 마찬가지로 프로그램 헤더 테이블이 없다면 0을 가집니다.
12) e_shentsize
- 섹션 헤더의 크기를 byte단위로 나타냅니다.. 섹션 헤더는 섹션 헤더 테이블의 하나의 엔트리를 차지하며, 모두 크기가 동일합니다.
13) e_shnum
- 섹션 헤더 테이블에 있는 엔트리의 수를 나타냅니다. 따라서, e_shentsize와 e_shnum의 곱으로 섹션 헤더 테이블의 전체 크기를 byte단위로 알 수 있다. 만약 섹션 헤더 테이블이 없다면, 당연히 0을 가질 것이다.
14) e_shstrndx (아직 이해 안감)
- 섹션의 이름을 나타내는 스트링(string)의 테이블과 관련된 엔트리의 섹션 헤더 테이블 인덱스(index)를 가지며, 만약 섹션 이름을 나타내는 테이블이 없다면 SHN_UNDEF 값을 가닙니다.
Marco | 설명 |
SHN_UNDEF | 이 값은 정의되지 않았거나 누락되었거나 관련이 없거나 의미가없는 섹션 참조를 나타냅니다. 예를 들어, 섹션 번호 SHN_UNDEF에 상대적인 "정의 된"기호는 정의되지 않은 기호입니다. |
SHN_LORESERVE | 이 값은 예약 된 인덱스 범위의 하한을 지정합니다. |
SHN_LOPROC | SHN_HIPROC 이상의 값은 프로세서 별 의미 체계를 위해 예약되어 있습니다. |
SHN_HIPROC | SHN_LOPROC보다 작거나 같은 값은 프로세서 별 의미 체계를 위해 예약되어 있습니다. |
SHN_ABS | 이 값은 해당 참조에 대한 절대 값을 지정합니다. 예를 들어, 섹션 번호 SHN_ABS에 대해 정의 된 심볼은 절대 값을 가지며 재배치의 영향을받지 않습니다. |
SHN_COMMON | 이 섹션과 관련하여 정의 된 기호는 일반적인 기호입니다. 포트란 COMMON 또는 할당되지 않은 C 외부 변수와 같은 것 입니다. |
SHN_HIRESERVE | 이 값은 SHN_LORESERVE와 SHN_HIRESERVE (포함) 사이의 예약 된 인덱스 범위의 상한을 지정합니다. 값은 섹션 헤더 테이블을 참조하지 않습니다. 즉, 섹션 헤더 테이블에는 예약 된 인덱스에 대한 항목이 포함되어 있지 않습니다. |
이전 글 : [ELF] 2. ELF Format의 분석 하기 위해 알아야 할 사전 지식
다음 글 :
'내맘대로 Study > 리눅스 ELF Format' 카테고리의 다른 글
[ELF] 2. ELF Format의 분석 하기 위해 알아야 할 사전 지식 (0) | 2020.01.16 |
---|---|
[ELF] 1. ELF 란? (0) | 2020.01.04 |