티스토리 뷰
https://i5on9i.blogspot.com/2019/01/os-elf-file-format.html
elf header 관련 정보들
e_ident[] Identification indexes
- http://recipes.egloos.com/m/5010841 : 설명이 잘돼 있다.
- http://www.skyfree.org/linux/references/ELF_Format.pdf
- http://lotus.tistory.com/29
- 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
TAG
- 데크에 바인딩묶기
- 인공눈
- 고강도
- 스타치
- 대일농장
- breakpoint
- 샤워기전
- 늙기
- 의학
- 제주영귤
- 명언
- sudachi
- 영귤
- 편집프로그램
- icon tool
- 제주녹색농원
- 미스터피자주문
- network error
- icon program
- 무릎마사지
- 영귤차
- 인공안구
- 보드고글
- 인테리어
- 녹색농원
- 칠오름
- 과학
- 칠오름농장
- 그림편집
- 상식
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함