色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

從C語言代碼分析Linux系統是如何創建進程的?

傅智翔2年前11瀏覽0評論

加載的具體過程

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.如果入口地址不為零,調用入口函數