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 indexes| Name | 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' 가 된다.

댓글 없음:
댓글 쓰기