티스토리 뷰

https://i5on9i.blogspot.com/2019/01/os-elf-file-format.html



elf header 관련 정보들
  1. http://recipes.egloos.com/m/5010841 : 설명이 잘돼 있다.
  2. http://www.skyfree.org/linux/references/ELF_Format.pdf
  3. http://lotus.tistory.com/29
  4. http://kldp.org/node/103483

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

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

1. relocatable file
2. executable file
3. shared object file

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

---------------------------------------------


ELF file 안에는 아래같은 요소가 들어간다.

ELF header
Program header table
Segment
Section
Section header table

ELF header언제나 ELF file 의 가장 처음에 위치한다.
하지만 다른 것들의 위치는 고정되어 있지 않다.

<그림필요>

먼저 이 ELF header 에 대해 얘기 해보자.
역시 위치가 고정되어 있기 때문에 elf file 를 까봐도 찾기가 가장 편할 것이다. 일단 코드상으로는 아래와 같다.

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[]


#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

실제로는 어떻게 이 값이 hex 로 저장되어 있는지 살펴보자.

<그림>



당연한 이야기지만 이 구조체 structure 를 보면 header에 어떤 것들이 들어있는지 알 수 있다.
구조체를 보면 알겠지만
처음 16개의 byte 들은 살펴보자.

0x7f, 0x45, 0x4c, 0x46

처음 4개는 이 파일이 ELF object file 인 것을 알려주는 magic number 이다.

그 다음 byte, 즉 5번째 byte 는 file 의 class 를 나타낸다.
ELF file 이 다양한 사이즈의 머신에서 가져다 쓸 수 있게 하기 위해서
이 ELF file 이 어떤 machine 에서 작동하는 놈이다라는 것을 알려줄 필요가 있다.

'1'은 32-bit objects 라는 것(ELFCLASS32)을 알려주며,
'2'는 64-bit objects 라는 것(ELFCLASS64)을 알려준다.

6번째 BYTE는 encoding type 을 알려준다.

'1'(ELFDATA2LSB) 는 little-endian
'2'(ELFDATA2MSB) 는 big-endian

을 나타낸다.(참고: http://i5on9i.egloos.com/4840672)

7번째 byte 는 ELF header version 을 알려준다.
보통 '1'(EV_CURRENT) 를 사용한다.


8번째 byte 부터
(EI_PAD 이 값이 '8'이기 때문에, 만약 header에 들어갈 값이 더 생긴다면 당연히 EI_PAD 값이 뒤로 밀리겠지.)
 끝까지 '0'으로 채워져 있는데,
그냥 의미없이 채워넣은 것이다, 즉 padding 이다. 흔히 하는 말로 reserved, 예약되어 있는 것이다.



17번째 byte 와 18번째 byte 는 지금 ELF file 의 format 을 알려준다.
자세한 사항은 놔두고,
일단 우리는 executable file 이기 때문에
'2' 가 된다.
<그림 >
0x02, 0x00,



0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0x00,





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함