載入的具體過程
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.如果入口地址不為零,呼叫入口函式
載入的具體過程
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.如果入口地址不為零,呼叫入口函式