編輯:關於android開發
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在加載進內存之後的情形,如下圖:
Android 開源庫和項目 2,android開源庫項目1、帶尾巴的RecyclerViewPager 特點:1、
Apache的詳細安裝教程和遇到的問題解決方案,apache解決方案有時需要自己去搭建一個Web服務器,有很多服務器可供選擇,這裡我自己搭建了一個Apache服務器,Ap
Android Studio SlidingMenu導入/配置 FloatMath找不到符號解決方法,studioslidingmenuSlidingMenu是一個第三方
使用APICloud設計物聯網APP,apicloud聯網app0、前言 1)、APP功能: 1、控制室內插座的開關。 2、查看室內實時溫濕度和溫濕度趨勢。 3、控制小車