Linux ELF 檔載入過程
- 首先 shell 會呼叫 fork(),新行程會接著呼叫 system call execve()
- execve() 對應到 kernel 的 sys_execve(),這函式會接著呼叫 do_execve()
- do_execve() parse 檔案的前 128 bytes,確認它是何種檔案 (script, ELF file, aout file, etc)
- 呼叫 search_binary_handle() 來找到檔案處理函式,ELF 的話為 load_elf_binary()
load_elf_binary() 做以下事情:
- 檢查檔案 header,確認是 ELF 檔案
- 尋找 .interp section,這邊指定了 dynamic linker 的路徑。如是靜態連結則無此 section
- 根據 ELF header,對檔案進行映射,將程式碼、資料等映射到虛擬空間內
- 將 sys_execve() 的返回位址改成 ELF 檔案的入口點。如是靜態連結,則是 ELF header 中 e_entry 所指的位址;如果動態連結,則是指向 .interp section 指向的 dynamic linker
當 load_elf_binary() 返回,do_execve() 返回,sys_execve() 返回。由於剛剛 sys_execve() 返回位址已被修改為 ELF 檔案的入口位址,因此 ELF 檔案開始執行。
留言
張貼留言