[컴][OS] ELF file format

리눅스 파일포맷 / 실행 파일 포맷 / 규격 / 파일 규격

ELF format

ELF file format 에 관한 얘기를 해보자.

elf header 관련 정보들

일단 여기서 이야기하는 것은 아주 첫 부분이다. 자세한 정보들은 아래 링크를 참고하자.

ELF type

ELF file 은 여러가지 모양(type)이 가능한데,
그 중에 주요한 3가지 type 이 있다.
  1. relocatable file
  2. executable file
  3. shared object file

일단 다른것은 생각하지 말고, 흔히 windows 에서 얘기하는 .exe 같은 executable file 에 대해서 살펴보자.

ELF executable

ELF file 안에는 아래같은 요소가 들어간다.
  1. ELF header : 언제나 ELF file 의 가장 처음에 위치
  2. Program header table
  3. Segment
  4. Section
  5. 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' 가 된다.


댓글 없음:

댓글 쓰기