elf文件结构
elf文件結構
有三種類型
可重定位文件(Relocatable File),包含由編譯器生成的代碼以及數據。鏈接器會將它與其它目標文件鏈接起來從而創建可執行文件或者共享目標文件。在 Linux 系統中,這種文件的后綴一般為 .o 。
可執行文件(Executable File),就是我們通常在 Linux 中執行的程序。
共享目標文件(Shared Object File),包含代碼和數據,這種文件是我們所稱的庫文件,一般以 .so 結尾。一般情況下,它有以下兩種使用情景
鏈接器(Link eDitor, ld)可能會處理它和其它可重定位文件以及共享目標文件,生成另外一個目標文件。
動態鏈接器(Dynamic Linker)將它與可執行文件以及其它共享目標組合在一起生成進程鏡像
目標文件既會參與程序鏈接又會參與程序執行。出于方便性和效率考慮,根據過程的不同,目標文件格式提供了其內容的兩種并行視圖,如下
鏈接視圖
文件開始處是 ELF 頭部,給出文件的組織情況
program header table 告訴系統如何創建進程
section header table 描述文件節區信息
ELF Header
描述elf文件的概要信息
e_ident放魔數,64還是32,小端還是大端,EV_CURRENT(版本必須是),填充
e_type是什么類型的elf文件
e_mechine是什么機器架構
e_version 是EV_CURRENt
e_entey 是 程序入口點的虛擬地址
e_phoff是程序頭部表的字節偏移
e_shoff是節頭表(段表)的字節偏移
e_flags不知道有什么用
e_ehsize頭部的字節長度(head)
e_phentsize頭部每個表相的字節長度(Program Header ENTry SIZE)
e_phnum 頭部表的項數(Program Header entry NUMbe)
e_shentsize節頭的字節長度
e_shnum節頭的項數
e_shstrndx(看不懂)
Program Header Table
Program Header Table 是一個結構體數組,每一個元素的類型是 Elf32_Phdr,描述了一個段或者其它系統在準備程序執行時所需要的信息。其中,ELF 頭中的 e_phentsize 和 e_phnum 指定了該數組每個元素的大小以及元素個數。一個目標文件的段包含一個或者多個節。程序的頭部只有對于可執行文件和共享目標文件有意義
該結構用于定位 ELF 文件中的每個節區的具體位置。
內存中任何段的虛擬地址與文件中對應的虛擬地址之間的差值對于任何一個可執行文件或共享對象來說是一個單一常量值。這個差值就是基地址,基地址的一個用途就是在動態鏈接期間重新定位程序
段內容
一個段可能包括一到多個節區,但是這并不會影響程序的加載。盡管如此,我們也必須需要各種各樣的數據來使得程序可以執行以及動態鏈接等等
Section Header Table
其實這個數據結構是在 ELF 文件的尾部
該結構用于定位 ELF 文件中的每個節區的具體位置。
首先,ELF頭中的 e_shoff 項給出了從文件開頭到節頭表位置的字節偏移。e_shnum 告訴了我們節頭表包含的項數;e_shentsize 給出了每一項的字節大小。
其次,節頭表是一個數組,每個數組的元素的類型是 ELF32_Shdr ,每一個元素都描述了一個節區的概要內容
typedef struct {ELF32_Word sh_name;ELF32_Word sh_type;ELF32_Word sh_flags;ELF32_Addr sh_addr;ELF32_Off sh_offset;ELF32_Word sh_size;ELF32_Word sh_link;ELF32_Word sh_info;ELF32_Word sh_addralign;ELF32_Word sh_entsize; } Elf32_Shdr;sh_name 節名稱
sh_type 節類型
sh_flags 描述節是否可寫,可執行,需要分配內存等屬性
sh_addr 在內存鏡像的位置
sh_offset在文件的偏移
sh_size 節區的字節大小
sh_link 此成員給出節區頭部表索引鏈接
sh_info 此成員給出附加信息
sh_addralign 某些節區的地址需要對齊
sh_entsize(不曉得)
elf中一些特殊的表(段)
.rel.xxxx (重定位表 用來描述修改段的內容 調指令的) sh_type為SHT_REL ()
typedef struct {Elf32_Addr r_offset;//重定位入口點的偏移Elf32_Word r_info;//類型和符號 }Elf32_Re;.strtab 字符串表
.shstrtab 段表
.symtab 符號表(經常被刪。。。)
Elf32_Sym的數組
(動態鏈接 延遲綁定的)
got
plt (dl_runtime_resolve())
.got保留全局變量引用的地址
.got.plt(函數引用的地址)(數組)
0 .dynamic段的地址
1 id
2 _d1_runtime_resolve(的地址)
.dynsym(動態符號表)
總結
- 上一篇: ftp客户端代码
- 下一篇: win7 由ie8升级ie11时安装不成