Linux ELF 檔載入過程


  1. 首先 shell 會呼叫 fork(),新行程會接著呼叫 system call execve()

  2. execve() 對應到 kernel 的 sys_execve(),這函式會接著呼叫 do_execve()

  3. do_execve() parse 檔案的前 128 bytes,確認它是何種檔案 (script, ELF file, aout file, etc)

  4. 呼叫 search_binary_handle() 來找到檔案處理函式,ELF 的話為 load_elf_binary()

load_elf_binary() 做以下事情:



  1. 檢查檔案 header,確認是 ELF 檔案

  2. 尋找 .interp section,這邊指定了 dynamic linker 的路徑。如是靜態連結則無此 section

  3. 根據 ELF header,對檔案進行映射,將程式碼、資料等映射到虛擬空間內

  4. 將 sys_execve() 的返回位址改成 ELF 檔案的入口點。如是靜態連結,則是 ELF header 中 e_entry 所指的位址;如果動態連結,則是指向 .interp section 指向的 dynamic linker

當 load_elf_binary() 返回,do_execve() 返回,sys_execve() 返回。由於剛剛 sys_execve() 返回位址已被修改為 ELF 檔案的入口位址,因此 ELF 檔案開始執行。


留言

熱門文章