Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Linux內核系列—11.操作系統開發之ELF格式,linuxelf

Linux內核系列—11.操作系統開發之ELF格式,linuxelf

編輯:關於android開發

Linux內核系列—11.操作系統開發之ELF格式,linuxelf


ELF文件的結構如下圖所示:

ELF文件由4部分組成,分別是ELF頭(ELF header)、程序頭表(Program header table)、節(Sections)和節頭表(Section header table)。

實際上,一個文件中不一定包含全部這些內容,而且它們的位置也未必如上圖所示這樣安排,只有ELF頭的位置是固定的,其余各部分的位置、大小等信息由ELF頭中的各項值來決定。

ELF header的格式如下代碼所示:

#define EI_NIDENT  16

typedef struct{
    unsigned char    e_ident[EI_NIDENT];
    Elf32_Half          e_type;
    Elf32_Half          e_machine;
    Elf32_word        e_version;
    Elf32_Addr         e_entry;
    Elf32_Off           e_phoff;
    Elf32_Off           e_shoff;
    Elf32_Word        e_flags;
    Elf32_Haif          e_ehsize;
    Elf32_Haif          e_phentsize;
    Elf32_Haif          e_phnum;
    Elf32_Haif          e_shentsize;
    Elf32_Haif          e_shnum;
    Elf32_Haif          e_shstrndx;
}Elf32_Ehdr;

其中各類型的說明見下表,由於ELF文件力求支持從8位到32位不同架構的處理器,所以才定義了下表中這些數據類型,從而讓文件格式與機器無關。

下面看一下ELF header中各項的意義。foobar文件:

最開頭是16字節的e_ident,其中包含用以表示ELF文件的字符,以及其他一些與機器無關的信息。

開頭的4字節是固定不變的,第1個字節值為0x7F,緊跟著就是ELF三個字符,這4字節表明這個文件是個ELF文件。

1.e_type——標識的是該文件的類型,取值就不一一列出了。文件foobar的e_type是2,表明它是一個可執行文件。

2.e_machine——foobar中此項的值為3,表明運行該程序需要的體系結構為Intel 80386.

3.e_version——文件的版本。

4.e_entry——程序的入口地址。文件foobar的入口地址為0x80480A0.

5.e_phoff——Program header table在文件中的偏移量(以字節計數),這裡的值是0x34.

6.e_shoff——Section header table在文件中的偏移量(以字節計數),這裡的值是0x1C0.

7.e_flags——對IA32而言,此項為0.

8.e_ehsize——ELF header大小(以字節計數),這裡值為0x34.

9.e_phentsize——Program header table中每一個條目(一個Program header)的大小。這裡值為0x20.

10.e_phnum——Program header table中有多少個條目,這裡有3個。

11.e_shentsize——Section header table中每一個條目(一個Section header)的大小,這裡值為0x28.

12.e_shnum——Section header table中有多少個條目,這裡有6個。

13.e_shstrndx——包含節名稱的字符串表是第幾個節(從零開始數)。這裡值為5,表示第5個節包含節名稱。

我們看到,Program header table在文件中的偏移量(e_phoff)為0x34,而ELF header大小(e_ehsize)也是0x34,可見ELF header後面緊接著就是Program header table。Program header數據結構如下:

typedef struct{
    Elf32_Word        p_type;
    Elf32_Off            p_offset;
    Elf32_Addr         p_vaddr;
    Elf32_Addr         p_paddr;
    Elf32_Word        p_filesz;
    Elf32_Word        p_memsz;
    Elf32_Word        p_flags;
    Elf32_Word        p_align;
}Elf32_Phdr;

實際上Program header描述的是系統准備程序運行所需的一個段或其他信息。程序頭表中共有三項(e_phnum=3),偏移分別是0x34~0x53、0x54~0x73和0x74~0x93.

1.p_type——當前Program header所描述的段的類型。

2.p_offset——段的第一個字節在文件中的偏移。

3.p_vaddr——段的第一個字節在內存中的虛擬地址。

4.p_paddr——在物理地址定位相關的系統中,此項是為物理地址保留。

5.p_filesz——段在文件中的長度。

6.p_memsz——段在內存中的長度。

7.p_flags——與段相關的標志。

8.p_align——根據此項值來確定段在文件以及內存中如何對齊。

Program header描述的是一個段在文件中的位置、大小以及它被放進內存後所在的位置和大小。如果我們想把一個文件加載進內存的話,需要的正是這些信息。

在foobar中共有三個Program header,其取值如下表所示:

根據這些信息,我們很容易知道foobar在加載進內存之後的情形,如下圖:

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved