Linux核心如何裝載和啟動乙個可執行程式

2022-09-01 23:21:33 字數 2450 閱讀 6627

概念總結

1.可執行程式是怎麼得來的

c**——預處理——彙編**——目標**——可執行檔案

2.可執行檔案的格式

可執行檔案最初為a.out格式,後來演化為coff格式,再後來變成pe(windows系統)和elf(linux系統)。elf:executable and linkable format,即可執行可鏈結格式。

3.可執行程式的執行環境

shell會呼叫execve將命令列引數和環境引數傳遞給可執行程式的main函式

gdb除錯

在原有的功能增加了exec

設定斷點

執行兩次之後在child處停下

s進入do_execve內部

new_ip是返回到使用者態的第一條指令的位址,通過readelf -h hello我們發現hello的入口點位址和new_ip的位址相同

start_thread修改了核心堆疊regs->ip等,從而改變了上下文環境

關於幾個問題的回答

1.新的可執行程式是從**開始執行的?

預設elf檔案從0x8048000出開始載入,前面是elf頭部資訊,大小一般各不相同。實際的入口在0x8048x000(x為不定值),即程式的入口點位址。

2.為什麼execve系統呼叫返回後新的可執行程式能順利執行?

在建立乙個新的使用者態堆疊時,實際上是把命令列引數內容和環境變數的內容通過指標傳遞到系統呼叫核心處理函式,然後核心處理函式在建立乙個新的可執行程式的使用者態堆疊時將引數拷貝到戶態堆疊,以此來初始化新的可執行程式的上下文環境。先函式呼叫引數傳遞,再系統呼叫引數傳遞。

命令列引數和環境串都放在使用者態堆疊中

3.對於靜態鏈結的可執行程式和動態鏈結的可執行程式execve系統呼叫返回時會有什麼不同?

靜態鏈結方法:#pragma comment(lib, "test.lib") ,靜態鏈結的時候,載入**就會把程式會用到的動態**或動態**的位址確定下來

靜態庫的鏈結可以使用靜態鏈結,動態鏈結庫也可以使用這種方法鏈結導入庫

load_elf_binary中呼叫了函式start_thread,其中的引數pt_regs就是核心堆疊的棧底

start_thread(regs, elf_entry, bprm->p)

靜態鏈結的elf_entry就是可執行檔案的entry,新的程式在返回使用者態之前需要修改int 0x80壓入核心堆疊的eip

動態鏈結方法:loadlibrary()/getprocessaddress()和freelibrary(),使用這種方式的程式並不在一開始就完成動態鏈結,而是直到真正呼叫動態庫**時,引導程式才計算(被呼叫的那部分)動態**的邏輯位址,然後等到某個時候,程式又需要呼叫另外某塊動態**時,引導程式又去計算這部分**的邏輯位址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態鏈結的程式。

總結

execve和fork都是特殊的系統呼叫,陷入到核心態在返回到使用者態繼續執行。fork比較特殊,父程序和一般的系統呼叫一樣,子程序從ret_from_fork開始執行返回到使用者態。execve陷入到核心態,用載入的新的可執行檔案將當前程序的可執行程式覆蓋,當其返回時已經不是原來的可執行程式,而是新的可執行程式了。因為呼叫exec並不建立新程序,只是用乙個全新的程式替換了當前程序的正文、資料、堆和棧段,所以前後的程序id並未改變

實驗七 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...