ELF format
ELF file format 에 관한 얘기를 해보자.
elf header 관련 정보들
일단 여기서 이야기하는 것은 아주 첫 부분이다. 자세한 정보들은 아래 링크를 참고하자.
ELF type
ELF file 은 여러가지 모양(type)이 가능한데,그 중에 주요한 3가지 type 이 있다.
- relocatable file
- executable file
- shared object file
일단 다른것은 생각하지 말고, 흔히 windows 에서 얘기하는 .exe 같은 executable file 에 대해서 살펴보자.
ELF executable
ELF file 안에는 아래같은 요소가 들어간다.- ELF header : 언제나 ELF file 의 가장 처음에 위치
- Program header table
- Segment
- Section
- Section header table.
ELF header 는 항상 처음에 위치하지만, 하지만 다른 것들의 위치는 고정되어 있지 않다.
<그림필요>
ELF header
먼저 이 ELF header 에 대해 얘기 해보자.역시 위치가 고정되어 있기 때문에 elf file 를 까봐도 찾기가 가장 편할 것이다. 일단 코드상으로는 아래와 같다.
code
e_ident[] Identification indexesName | Value | Purpose |
---|---|---|
EI_MAG0 | 0 | File identification |
EI_MAG1 | 1 | File identification |
EI_MAG2 | 2 | File identification |
EI_MAG3 | 3 | File identification |
EI_CLASS | 4 | File class |
EI_DATA | 5 | Data encoding |
EI_VERSION | 6 | File Version |
EI_PAD | 7 | Start of padding bytes |
EI_NIDENT | 16 | e_ident[] |
struct
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT]; /*Magic number and other info */
ElfN_Half e_type; /*Object file type */
ElfN_Half e_machine; /* Architecture */
ElfN_Word e_version; /* Object file version */
ElfN_Addr e_entry; /* Entry point virtual address */
ElfN_Off e_phoff; /* Program header table file offset */
ElfN_Off e_shoff; /* Section headr table file offset */
ElfN_Word e_flags; /* Processor-specific flags */
ElfN_Half e_ehsize; /* ELF header size in bytes */
ElfN_Half e_phentsize; /* Program header table entry size */
ElfN_Half e_phnum; /* Program header entry count */
ElfN_Half e_shentsize; /* Section header table entry size */
ElfN_Half e_shnum; /* Sectino header table entry count */
ElfN_Half shstrndx; /* Sectino header string table index */
} Elf32_Ehdr
binaries
실제로는 어떻게 이 값이 hex 로 저장되어 있는지 살펴보자.<그림>
확대 |
당연한 이야기지만 이 구조체 structure 를 보면 header에 어떤 것들이 들어있는지 알 수 있다.
아래와 같은 elf file 이 있다고 하자.
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x00, ...e_ident
처음 16개의 byte 들(e_ident[EI_NIENT])을 살펴보자.
- EI_MAG*
0x7f, 0x45, 0x4c, 0x46
- 처음 4개는 이 파일이 ELF object file 인 것을 알려주는 magic number 이다.
- EI_CLASS
- 그 다음 byte, 즉 5번째 byte 는 file 의 class 를 나타낸다.
- ELF file 이 다양한 사이즈의 머신에서 가져다 쓸 수 있게 하기 위해서 이 ELF file 이 어떤 machine 에서 작동하는 놈이다라는 것을 알려줄 필요가 있다.
- '1'은 32-bit objects 라는 것(ELFCLASS32)을 알려주며,
- '2'는 64-bit objects 라는 것(ELFCLASS64)을 알려준다.
- EI_DATA
- 6번째 BYTE는 encoding type 을 알려준다.
- '1'(ELFDATA2LSB) : little-endian
- '2'(ELFDATA2MSB) : big-endian
- EI_VERSION
- 7번째 byte 는 ELF header version 을 알려준다.
- 보통 '1'(EV_CURRENT) 를 사용한다.
- EI_PAD
- 8번째 byte 부터 끝까지 '0'으로 채워져 있는데, 그냥 의미없이 채워넣은 것이다, 즉 padding 이다. 흔히 하는 말로 reserved, 예약되어 있는 것이다.
- (EI_PAD 이 값이 현재 '7'인데, 만약 header에 들어갈 값이 더 생긴다면 당연히 EI_PAD 값을 큰 수로 변경해야 한다.)
e_type
17번째 byte 와 18번째 byte 는 지금 ELF file 의 format 을 알려준다.자세한 사항은 놔두고, 일단 여기서는 executable file 이기 때문에 '2' 가 된다.
댓글 없음:
댓글 쓰기