下面分析:
1.先看elf檔案的格式。
elf頭描述了該檔案的組織情況,elf
檔案預設從
0x8048000
開始載入,
檔案頭中
entry point address
的內容為程式實際入口,啟動乙個剛載入過可執行檔案的程序時就從此處執行。
使用命令readelf -h hello可以檢視檔案的elf頭。具體結構定義如下:
elf在object檔案中有三種主要的目標檔案型別:
1)乙個可重定位(relocatable)檔案儲存著**和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。主要是.o檔案 2)
乙個可執行
(executable)
檔案儲存著乙個用來執行的程式;該檔案指出了
exec(ba_os)
如何來建立程式程序映象。 3)
乙個共享
object
可以和其他的可重定位和共享
object
檔案來建立其他的
object
。第二個是動態鏈結器,聯合乙個可執行檔案和其他的共享
object
檔案來建立乙個程序映象。主要是.so檔案
3)在shell中輸入可執行程式所需的引數,shell程式把這些引數用引數傳遞的方式傳給execve系統呼叫,然後execve系統呼叫以系統呼叫引數傳遞的方式傳給sys_execve,最後sys_execve在初始化新程式的使用者態堆疊時,將這些引數放在main函式取引數的位置上。
4)如果當前系統中沒有所需要的資源,那麼新程序會被掛起,直到有
資源喚醒新程序,轉為可執行態。
3.關於靜態鏈結的可執行程式和動態鏈結的可執行程式,它們在處理execve系統呼叫返回時的比較:
1)對於靜態鏈結的可執行程式,elf_entry是新程式的執行起點。
execve系統呼叫會呼叫sys_execve,sys_execve再呼叫do_execve,do_execve再呼叫do_execve_common,do_execve_common再呼叫exec_binprm。在exec_binprm中:
對於elf檔案格式,fmt函式指標實際會執行load_elf_binary,load_elf_binary會呼叫start_thread,在start_thread中通過修改核心堆疊中eip的值,使其指向elf_entry,讓執行流程跳轉到elf_entry執行。
2)對於動態鏈結的可執行程式,需要先載入鏈結器ld,elf_entry = load_elf_interp(…)
將cpu控制權交給ld來載入依賴庫,ld完成載入工作後將cpu控制權還給新程序。
3)載入時間和執行時間對比
-靜態鏈結是在生成可執行程式的時候就把庫中的內容加入到程式中,即一開始就把所有模組都載入進入記憶體
-裝載時動態鏈結是在將功能模組讀入記憶體時把動態庫中呼叫到的相關模組的內容載入記憶體
-執行時動態鏈結是在執行程式呼叫到模組內容時再將動態庫中的相應模組載入到記憶體。
總結:新的可執行程式通過修改核心堆疊eip作為新程式的起點,從new_ip開始執行後start_thread把返回到使用者態的位置從int 0x80的下一條指令變成新載入的可執行檔案的入口位置。
當執行到execve系統呼叫時,陷入核心態,用execve載入的可執行檔案覆蓋當前程序的可執行程式,當execve系統呼叫返回時,返回新的可執行程式的執行起點(main函式位置),所以execve系統呼叫返回後新的可執行程式能順利執行。
execve系統呼叫返回時,如果是靜態鏈結,elf_entry指向可執行檔案規定的頭部(main函式對應的位置0x8048***);如果需要依賴動態鏈結庫,elf_entry指向動態鏈結器的起點。動態鏈結主要是由動態鏈結器ld來完成的。
實驗七 Linux核心如何裝載和啟動乙個可執行程式
理解編譯鏈結的過程和elf可執行檔案格式 對於靜態鏈結來說,start thread中的elf entry就是可執行檔案的entry 在乙個新的可執行檔案返回到使用者態之前,要把壓入核心棧的eip修改,用新的可執行程式的起點 sys execve的內部處理過程 do open開啟檔案,載入檔案頭部 ...
作業七 Linux核心如何裝載和啟動乙個可執行程式
可執行檔案的建立 預處理 編譯和鏈結 在object檔案中有三種主要的型別。乙個可重定位 relocatable 檔案儲存著 和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。乙個可執行 executable 檔案儲存著乙個用來執行的程式 該檔案指出了exec b...
作業七 Linux核心如何裝載和啟動乙個可執行程式
可執行檔案的建立 預處理 編譯和鏈結 在object檔案中有三種主要的型別。乙個可重定位 relocatable 檔案儲存著 和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。乙個可執行 executable 檔案儲存著乙個用來執行的程式 該檔案指出了exec b...