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

2021-09-24 22:25:07 字數 3292 閱讀 6490

可執行檔案的建立——預處理、編譯和鏈結

在object檔案中有三種主要的型別。

乙個可重定位(relocatable)檔案儲存著**和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。

乙個可執行(executable)檔案儲存著乙個用來執行的程式;該檔案指出了exec(ba_os)如何來建立程式程序映象。

-第乙個是連線編輯器[請參看ld(sd_cmd)],可以和其他的可重定位和共享object檔案來建立其他的object。

-第二個是動態鏈結器,聯合乙個可執行檔案和其他的共享object檔案來建立乙個程序映象。

乙個object檔案被彙編器和聯接器建立, 想要在處理機上直接執行的object檔案都是以二進位制來存放的。

那些需要抽象機制的程式,比如shell指令碼,是不被接受的。

object檔案格式

linking 視角 execution 視角

**********== **********====

elf header elf header

program header table (optional) program header table

section 1 segment 1

... segment 2

section n ...

section header table section header table (optional)

乙個elf頭在檔案的開始,儲存了路線圖(road map),描述了該檔案的組織情況。

sections儲存著object 檔案的資訊,從連線角度看:包括指令,資料,符號表,重定位資訊等。特別sections的描述會出項在以後的第一部分。

第二部分討論了段和從程式的執行角度看檔案。

假如乙個程式頭表(program header table)存在,那麼它告訴系統如何來建立一

個程序的記憶體映象。被用來建立程序映象(執行乙個程式)的檔案必須要有乙個程

序頭表(program header table);可重定位檔案不需要這個頭表。乙個

section頭表(section header table)包含了描述檔案sections的資訊。每個

section在這個表中有乙個入口;每個入口給出了該section的名字,大小,

等等資訊。在聯接過程中的檔案必須有乙個section頭表;其他object檔案可要

可不要這個section頭表。

注意: 雖然圖顯示出程式頭表立刻出現在乙個elf頭後,section頭表跟著其他

section部分出現,事實是的檔案是可以不同的。此外,sections和段(segments)

沒有特別的順序。只有elf頭(elf header)是在檔案的固定位置。

資料表示

object檔案格式支援8位、32位不同的處理器。不過,它試圖努力的在更大

或更小的體系上執行。因此,object檔案描繪一些控制資料需要用與機器

無關的格式,使它盡可能的用一般的方法甄別object檔案和描述他們的內容。

在object檔案中剩餘的資料使用目標處理器的編碼方式,不管檔案是在哪台

機子上建立的。

實驗樓環境圖

1.新的可執行程式是從**開始執行的? 2.為什麼execve系統呼叫返回後新的可執行程式能順利執行? 3.對於靜態鏈結的可執行程式和動態鏈結的可執行程式execve系統呼叫返回時會有什麼不同?

.elf可執行檔案會被預設對映到0x804800位址

execve核心態,可執行檔案覆蓋了原來的,返回時是新的可執行程式,也就是main函式發生的起點,載入新的可執行可執行環境。

需要動態鏈結的可執行檔案先載入鏈結器ld

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

將cpu控制權交給ld來載入依賴庫並完成動態鏈結。然後在初始化新程式堆疊時,拷貝進去,先函式呼叫引數傳遞,在系統呼叫引數傳遞

shell程式——>execve ——>sys_execve

do_execve----> do_execve_common----->exec_vinprm------>search_binary_handler

execve系統呼叫返回到使用者態

棧底pt_regs start_thread(...,elf_entry,....)

通過修改核心堆疊中eip的值作為新程式的起點。new ip, new sp.

elf_entry是新的可執行程式的起點。

.elf可執行檔案會被預設對映到0x804800位址

execve核心態,可執行檔案覆蓋了原來的,返回時是新的可執行程式,也就是main函式發生的起點,載入新的可執行可執行環境。

shell程式——>execve ——>sys_execve

do_execve----> do_execve_common----->exec_vinprm------>search_binary_handler

棧底pt_regs start_thread(...,elf_entry,....)

通過修改核心堆疊中eip的值作為新程式的起點。new ip, new sp.

**註明「鄭偉 +

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

可執行檔案的建立 預處理 編譯和鏈結 在object檔案中有三種主要的型別。乙個可重定位 relocatable 檔案儲存著 和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。乙個可執行 executable 檔案儲存著乙個用來執行的程式 該檔案指出了exec b...

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

理解編譯鏈結的過程和elf可執行檔案格式 對於靜態鏈結來說,start thread中的elf entry就是可執行檔案的entry 在乙個新的可執行檔案返回到使用者態之前,要把壓入核心棧的eip修改,用新的可執行程式的起點 sys execve的內部處理過程 do open開啟檔案,載入檔案頭部 ...

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

linux核心如何裝載和啟動乙個可執行程式 沙雨濟一 實驗目的 理解編譯鏈結的過程和elf可執行檔案格式 程式設計使用exec 庫函式載入乙個可執行檔案,動態鏈結分為可執行程式裝載時動態鏈結和執行時動態鏈結,程式設計練習動態鏈結庫的這兩種使用方式 使用gdb跟蹤分析乙個execve系統呼叫核心處理函...