내맘대로 Study/리눅스 ELF Format

[ELF] 3. ELF header 분석

jinkwon.kim 2020. 1. 22. 00:34
728x90
반응형

1. ELF Header의 역활 

  이 파일에 대한 메타 정보를 제공하는 역활을 합니다.

 

2. ELF Header의 파일에서의 위치

  파일의 offset 0에 위치 합니다.

 

3. ELF를 구성하는구조체에 대하여 알아야 할 사항 

[ 원문 ] 

  All data structures that the file format defines follow the "natural" size and alignment guidelines for the relevant class.  If necessary, data structures contain explicit padding to ensure 4-byte alignment for  4-byte  objects,  to force structure sizes to a multiple of 4, etc.All data structures that the file format defines follow the "natural" size and alignment guidelines for the relevant class.  If necessary, data structures contain explicit padding to ensure 4-byte alignment for  4-byte  objects, to force structure sizes to a multiple of 4, etc.

 

The ELF header is described by the type Elf32_Ehdr or Elf64_Ehdr: 

 

[ 한글 ] 

  파일 포맷을 정의하는 모든 데이터 구조체는 4byte 정렬을 따릅니다. 그래서 구조체가 4byte 정렬이 되지 않을 경우 패딩을 넣어 입으로 4byte 정렬을 구현 합니다. 

그리고 ELF header는 운영체에 맞게 32bit Header(Elf32_Ehdr) 와 64bit Header(Elf64_Ehdr)가 존재 합니다.

 

* 구조체를 4byte로 정렬 하는 이유는 32bit cpu가 한번에 메모리에 가져올수 있는 데이터량이 32bit(=4byte)이기 때문 입니다. 그래서 효율성을 추구하는 프로그램에서는 4byte 메모리 정렬을 합니다. 

 

4. ELF Header 구조체 

  1) ELF Header 구조체

    #define EI_NIDENT 16

    typedef struct {
        unsigned char e_ident[EI_NIDENT];  
        uint16_t      e_type;  
        uint16_t      e_machine;  
        uint32_t      e_version;  
        ElfN_Addr    e_entry;   
        ElfN_Off      e_phoff;            
        ElfN_Off      e_shoff;               
        uint32_t      e_flags;
        uint16_t      e_ehsize;
        uint16_t      e_phentsize;
        uint16_t      e_phnum;
        uint16_t      e_shentsize;
        uint16_t      e_shnum;
        uint16_t      e_shstrndx;
    } ElfN_Ehdr;

 

5. ELF Header 구조체 멤버 설명

  1) unsigned char e_ident[EI_NIDENT]; 

    - EI_NIDENT 는 16 입니다.

 

    [ 원문 ]

      - this  array  of  bytes specifies to interpret the file, independent of the processor or the file's remaining

        contents.  

      - Within this array everything is named by macros, which start with the prefix EI_ and may contain

        values which start with the prefix ELF.  

      - The following macros are defined:

    [ 한글 ]

      - e_ident에 기록된 정보를 통하여 파일을 해석 합니다. 그러나 프로세서 또는 파일의 나머지 내용과는 관련이 없습

        니다.

      - 배열 내에서의 위치는 접두사 EI로 시작하는 값으로 위치를 지정 하며, ELF접두사로 시작하는 값으로 배열을 값을

        채웁니다.

      - e_ident와 관련된 macro 들의 정의는 다음과 같습니다.

      (1)  e_indent의 array의 index별 설명

더보기
index marco 

index

marco 값 

index 별 설명 index별 사용가능한 marco index별 사용가능한 marco 설명
EI_MAG0         0 magic number  (0x7f) ELFMAG0  magic 값 0x7f
EI_MAG1         1 magic number  (E) ELFMAG1  magic 값 E
EI_MAG2         2 magic number  (L) ELFMAG2 (L) magic 값 L
EI_MAG3         3 magic number  (F) ELFMAG3 (F) magic 값 F
EI_CLASS       


4 이 바이너리의 아키텍처를 식별합니다


ELFCLASSNONE  This class is invalid
ELFCLASS32     32-bit architecture
ELFCLASS64    64-bit architecture
EI_DATA        


5 프로세서 별 사용하는 data encoding을 지정합니다.


ELFDATANONE Unknown data format.
ELFDATA2LSB  2의 보수 , little-endian. 
ELFDATA2MSB 2의 보수, big-endian. 
EI_VERSION     

6 ELF 명세서 버전  EV_NONE    Invalid version
EV_CURRENT Current version
EI_OSABI       










7 객체가 대상으로하는 운영 체제와 ABI를 명시 합니다. ELFOSABI_NONE Same as ELFOSABI_SYSV
ELFOSABI_SYSV        UNIX System V ABI. 
ELFOSABI_HPUX        HP-UX ABI. 
ELFOSABI_NETBSD      NetBSD ABI. 
ELFOSABI_LINUX       Linux ABI. 
ELFOSABI_SOLARIS     Solaris ABI. 
ELFOSABI_IRIX        IRIX ABI.
ELFOSABI_FREEBSD     FreeBSD ABI. 
ELFOSABI_TRU64       TRU64 UNIX ABI. 
ELFOSABI_ARM ARM architecture ABI. 
ELFOSABI_STANDALONE standalone (embedded) ABI
EI_ABIVERSION   8

개체가 대상으로하는 ABI의 버전을 식별합니다.

이 필드는 호환되지 않는 ABI 버전을 구별하는 데 사용됩니다.

이 버전 번호의 해석은 EI_OSABI 필드로 식별 된 ABI에 따라 다릅니다.

이 사양을 따르는 응용 프로그램은 0 값을 사용합니다

   
EI_PAD          9 패딩의 시작을 표시 e_indent의 배열 끝까지 0으로 채웁니다.

 

  2) e_type

    - 파일의 type을 명시 합니다. 

더보기
Macro 설명
ET_NONE  An unknown type. 
ET_REL       A relocatable file. 
ET_EXEC      An executable file. 
ET_DYN       A shared object. 
ET_CORE      A core file. 

 

  3) e_machine

    - 이 파일을 사용하기 위해서 필요한 architecture정보를 나타 냅니다.

더보기
Macro 설명
EM_NONE      An unknown machine. 
EM_M32       AT&T WE 32100. 
EM_SPARC     Sun Microsystems SPARC. 
EM_386       Intel 80386. 
EM_68K       Motorola 68000. 
EM_88K       Motorola 88000. 
EM_860       Intel 80860. 
EM_MIPS      MIPS RS3000 (big-endian only). 
EM_PARISC    HP/PA. 
EM_SPARC32PLUS  SPARC with enhanced instruction set. 
EM_PPC       PowerPC. 
EM_PPC64     PowerPC 64-bit. 
EM_S390      IBM S/390 
EM_ARM       Advanced RISC Machines 
EM_SH        Renesas SuperH 
EM_SPARCV9   SPARC v9 64-bit. 
EM_IA_64     Intel Itanium 
EM_X86_64    AMD x86-64 
EM_VAX       DEC Vax. 

  4) e_version

    - Object 파일의 버전 정보를 나타낸다.

더보기
Macro 설명
EV_NONE    Invalid version
EV_CURRENT Current version

  5) e_entry

    - 시스템이 실행하기 위해서 제어를 옮길때 어디로 옮겨야 하는지를 가르쳐주는 가상주소를 가진다. 만약 파일이 진입점(entry point)를 가지지 않는다면 0을 가집니다.

 

  6) e_phoff

    - program header table의 file offset을 byte단위로 나타낸다. 프로그램 헤더 테이블이 없다면 당연히 0을 가집니다.

 

  7) e_shoff

    - Section Header Table의 file offset을 byte단위로 나타낸다. 역시 섹션 헤더 테이블을 가지지 않는다면 0을 가집니다.

 

  8) e_flags

    - 파일과 관련되서 프로세서-스펙 flag를 가진다. flag을 나타내는 형태는 EF_[machine_flag]이 될 것이다. 현재는 정의도니 것이 없습니다. 

 

  9) e_ehsize

    - ELF Header의 크기를 byte로 나타 냅니다.

 

 10) e_phentsize

    - 파일의 program header table에서 한 항목의 크기를 바이트 단위로 유지합니다. 모든 항목은 같은 크기입니다.

 

 11) e_phnum

    - program header table의 개수를 나타 냅니다. 따라서, 전체 프로그램 헤더 테이블의 크기는 앞에 나온 e_phentsize e_phnum의 곱이 될 것 입니다마찬가지로 프로그램 헤더 테이블이 없다면 0을 가집니다.

 

 12) e_shentsize

    - 섹션 헤더의 크기를 byte단위로 나타냅니다.. 섹션 헤더는 섹션 헤더 테이블의 하나의 엔트리를 차지하며, 모두 크기가 동일합니다.

 

 13) e_shnum

    - 섹션 헤더 테이블에 있는 엔트리의 수를 나타냅니다따라서, e_shentsize e_shnum의 곱으로 섹션 헤더 테이블의 전체 크기를 byte단위로 알 수 있다. 만약 섹션 헤더 테이블이 없다면, 당연히 0을 가질 것이다.

 

 14) e_shstrndx (아직 이해 안감)

    - 섹션의 이름을 나타내는 스트링(string)의 테이블과 관련된 엔트리의 섹션 헤더 테이블 인덱스(index)를 가지며, 만약 섹션 이름을 나타내는 테이블이 없다면 SHN_UNDEF 값을 가닙니다.

더보기
Marco 설명
SHN_UNDEF      이 값은 정의되지 않았거나 누락되었거나 관련이 없거나 의미가없는 섹션 참조를 나타냅니다. 예를 들어, 섹션 번호 SHN_UNDEF에 상대적인 "정의 된"기호는 정의되지 않은 기호입니다.
SHN_LORESERVE  이 값은 예약 된 인덱스 범위의 하한을 지정합니다.
SHN_LOPROC     SHN_HIPROC 이상의 값은 프로세서 별 의미 체계를 위해 예약되어 있습니다.
SHN_HIPROC     SHN_LOPROC보다 작거나 같은 값은 프로세서 별 의미 체계를 위해 예약되어 있습니다.
SHN_ABS        이 값은 해당 참조에 대한 절대 값을 지정합니다. 예를 들어, 섹션 번호 SHN_ABS에 대해 정의 된 심볼은 절대 값을 가지며 재배치의 영향을받지 않습니다.
SHN_COMMON     이 섹션과 관련하여 정의 된 기호는 일반적인 기호입니다. 포트란 COMMON 또는 할당되지 않은 C 외부 변수와 같은 것 입니다.
SHN_HIRESERVE  이 값은 SHN_LORESERVE와 SHN_HIRESERVE (포함) 사이의 예약 된 인덱스 범위의 상한을 지정합니다.
값은 섹션 헤더 테이블을 참조하지 않습니다.
즉, 섹션 헤더 테이블에는 예약 된 인덱스에 대한 항목이 포함되어 있지 않습니다.

 

 

전체 목차 : 1. ELF 란?

 

[ELF] 1. ELF 란?

1. 전체 목차 1. ELF 란? 2. ELF Format의 분석 하기 위해 알아야 할 사전 지식 2. ELF 란 무엇인가?? 리눅스에서 실행 가능(Executable)하고 링크 가능(Linkable)한 File의 Format을 ELF(Executable and Linkable..

doitnow-man.tistory.com

이전 글 : [ELF] 2. ELF Format의 분석 하기 위해 알아야 할 사전 지식
다음 글 : 

728x90
반응형