回覆列表
  • 1 # 每天多一點金

    載入的具體過程

    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.如果入口地址不為零,呼叫入口函式

  • 中秋節和大豐收的關聯?
  • 正常多少天洗一次頭髮比較好?