日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

elf文件结构

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的概要信息

#define EI_NIDENT 16typedef struct {unsigned char e_ident[EI_NIDENT];'\x7felf'(魔數)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_Half e_ehsize;ELF32_Half e_phentsize;ELF32_Half e_phnum;ELF32_Half e_shentsize;ELF32_Half e_shnum;ELF32_Half e_shstrndx; } Elf32_Ehdr;

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 文件中的每個節區的具體位置。

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;

內存中任何段的虛擬地址與文件中對應的虛擬地址之間的差值對于任何一個可執行文件或共享對象來說是一個單一常量值。這個差值就是基地址,基地址的一個用途就是在動態鏈接期間重新定位程序
段內容
一個段可能包括一到多個節區,但是這并不會影響程序的加載。盡管如此,我們也必須需要各種各樣的數據來使得程序可以執行以及動態鏈接等等
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的數組

typedef struct {Elf32_Word st_name;//符號名Elf32_Addr st_value;//值 common塊之類的Elf322_Word st_size;//符號大小unsigned char st_info;//符號類型和綁定信息unsigned char st_other;//沒用Elf32_Half st_shndx;//符號所在段 }

(動態鏈接 延遲綁定的)
got
plt (dl_runtime_resolve())
.got保留全局變量引用的地址
.got.plt(函數引用的地址)(數組)
0 .dynamic段的地址
1 id
2 _d1_runtime_resolve(的地址)
.dynsym(動態符號表)

總結

以上是生活随笔為你收集整理的elf文件结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。