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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ELF文件的格式和加载过程

發布時間:2024/4/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ELF文件的格式和加载过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一) ELF 文件的格式

????? ELF 文件類型 (1) 可重定位文件( .o 目標文件) : 用于鏈接創建可執行文件或 so 文件

??????????????????????????? (2) 可執行文件 ????? ????????????? : 用于執行

??????????????????????????? (3)so( 共享對象 ) 文件 ?????????? : 用于鏈接

??????

?????? :?? 一個 Program Header 對應一個 Segment

?????? ?? ? 一個 Section Header 對應一個 Section

????????????? Segment Section 構成

?

Segment 類型 :#define PT_NULL???????? 0??????????? ?????? unused

#define PT_LOAD ??????? 1??????????? ?????? 可加載段 ( 代碼節和數據節 )

#define PT_DYNAMIC 2??????????? ?????? 動態鏈接段 ( 動態鏈接信息 )

#define PT_INTERP ????? 3??????????? ?????? 解釋器段 ( 動態鏈接器路徑 )

#define PT_NOTE???????? 4??????????? ?????? auxiliary information

#define PT_SHLIB 5??????????? ????????????? reserved - purpose undefined

#define PT_PHDR???????? 6??????????? ?????? program header

#define PT_NUM????????? 7??????????? ?????? Number of segment types

#define PT_LOOS???????? 0x60000000??? reserved range for OS

#define PT_HIOS????????? 0x6fffffff?????? ?????? specific segment types

#define PT_LOPROC??? 0x70000000??? reserved range for processor

#define PT_HIPROC???? 0x7fffffff?????? ?????? specific segment types

?

Section 類型 : ? #define ELF_BSS??????? ?? ".bss"???????????? uninitialized data

#define ELF_DATA?????? ?? ".data "?????????? 數據節 initialized data

#define ELF_DEBUG???? ?? ".debug"? ?????? debug

#define ELF_DYNAMIC?? ? ".dynamic "? 動態鏈接節 dynamic linking information

#define ELF_DYNSTR ".dynstr"? ?????? dynamic string table

#define ELF_DYNSYM ?????? ".dynsym"????? dynamic symbol table

#define ELF_FINI??? ???????? ".fini"???????????? termination code

#define ELF_GOT??????? ? ".got"???????????? global offset table

#define ELF_HASH?????? ? ".hash"?????????? symbol hash table

#define ELF_INIT??????? ? ".init"???????????? initialization code

#define ELF_REL_DATA?? ? ".rel.data"?????? relocation data

#define ELF_REL_FINI??? ".rel.fini"? ?????? relocation termination code

#define ELF_REL_INIT??? ".rel.init"? ?????? relocation initialization code

#define ELF_REL_DYN?? ?? ".rel.dyn" ?????? relocaltion dynamic link info

#define ELF_REL_RODATA? ".rel.rodata"??? relocation read-only data

#define ELF_REL_TEXT?? ".rel.text" ?????? relocation code

#define ELF_RODATA???? ".rodata"? ?????? read-only data

#define ELF_SHSTRTAB?? ".shstrtab"?????? section header string table

#define ELF_STRTAB???? ? ".strtab"?? ?????? string table

#define ELF_SYMTAB??? ?? ".symtab"?????? ?????? symbol table

#define ELF_TEXT?????? ? ".text "??????????? 代碼節 code

?

?

?

?

(二) ELF 文件的加載過程

源文件 Trunk/System/ElfLoader/dll/elfloader.c

LoadElfExec() 函數

?

加載的具體過程

1. 打開文件 open_library(char* filename)

?????? 系統調用 open(): 創建 File 結構體 , 放入進程打開文件表 , 返回 ( 打開文件表 ) 下標

2. 讀出文件頭和程序頭表 IsElfFormat(FILE)

?????? 讀出 ELF 文件頭 ( 同時讀出了程序頭表 Program Header Table), 判斷 ELF 格式根據文件頭中的 e_ident 來比較判斷 .

3. 加載文件 load_library(char * filename,int fd)

?????? (1) 計算所有 segment 占用內存大小 get_lib_extents()

通過遍歷程序頭表 (Program Header Table), 算出所有 segment 將占用的內存大小 extents_size

(2) 分配內存 alloc_mem_region(extents_size)

?????? 匿名映射一塊非共享的私有內存 ( 不涉及文件 )

(3) 分配 soinfo 結構體 alloc_info(char *filename)

?????? 從全局靜態 soinfo 結構體數組中分配 soinfo 結構體 ( 描述整個 ELF 文件 )

(4) 加載 segment

load_segment(int fd,void* header,soinfo*si)

(1) 可加載段 (PT_LOAD): 映射到內存

mmap(void * start,size_t len, int prot,int flags,int fd,off_t offsize)

ELF 文件 offsize 處的 segment 映射到已分配內存的 start

????????????? (2) 動態鏈接段

???????????????????? 由動態鏈接節設置 soinfo 中的動態鏈接信息

?????? (5) 設置 soinfo 結構體

4. 加載依賴的動態鏈接庫

5.重定位(自身符號)

?? 重定位表項:?? Elf32_Addr???? r_offset?? (重定位)內存地址(offset of relocation)

?????? ???????????????????? Elf32_Word??? r_info????? 符號表下標和類型(symbol table index and type)

??????

?? 符號表項:????? Elf32_Word??? st_name? 符號名(name - index into string table)

?????? ???????????????????? Elf32_Addr???? st_value?? 符號值(symbol value)

?????? ???????????????????? Elf32_Word??? st_size???? ???? ?????? symbol size

?????? ???????????????????? unsigned char st_info??? ?????? ?????? type and binding

?????? ???????????????????? unsigned char st_other?? ???? ?????? 0 - no defined meaning

?????? ???????????????????? Elf32_Half????? st_shndx;????????????? ?????? section header index

?

?????? 根據重定位表(表項)查符號表,得到符號內存地址,修改(重定位)內存值

?

最后得到soinfo結構體數組描述了所有加載的文件

6.如果入口地址不為零,調用入口函數

?

?

?

?

總結

以上是生活随笔為你收集整理的ELF文件的格式和加载过程的全部內容,希望文章能夠幫你解決所遇到的問題。

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