第七週:可執行程序的裝載

呂鬆鴻 原創做品轉載請註明出處 《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000shell

1、預處理,編譯,連接和目標文件格式

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

 

c代碼->預處理->彙編代碼->彙編器->目標代碼->連接成可執行文件->加載到內核執行
函數

2.目標文件的格式ELF

      符號修飾標準、變量內層佈局、函數調用方式等這些跟可執行代碼二進制兼容性相關的內容稱爲ABI(Application Binary Interface)佈局

常見的ABI格式:spa

3.靜態連接的ELF可執行文件和進程的地址空間

 

通常靜態連接將會把全部代碼放在同一個代碼段。命令行

動態鏈接的進程會有多個代碼段。3d

2、可執行程序、共享庫和動態連接

1.可執行程序的執行環境

命令行參數和shell環境,通常咱們執行一個程序的Shell環境,咱們的實驗直接使用execve系統調用。

Shell自己不限制命令行參數的個數, 命令行參數的個數受限於命令自身。

shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數。

命令行參數和環境串都放在用戶態堆棧中。

 

2.裝載時動態連接和運行時動態連接應用舉例

動態連接分爲可執行程序裝載時動態連接和運行時動態連接

3、可執行程序的裝載

1. sys_execve內核處理過程

(1)新的可執行程序起點

通常是地址空間爲0x8048000或0x8048300

(2)execve與fork

execve和fork都是特殊一點的系統調用:通常的都是陷入到內核態再返回到用戶態。
  • fork兩次返回,第一次返回到父進程繼續向下執行,第二次是子進程返回到ret_from_fork而後正常返回到用戶態。code

  • execve執行的時候陷入到內核態,用execve中加載的程序把當前正在執行的程序覆蓋掉,當系統調用返回的時候也就返回到新的可執行程序起點。blog

execve
- 執行到可執行程序 -> 陷入內核
- 構造新的可執行文件 -> 覆蓋掉原可執行程序
- 返回到新的可執行程序,做爲起點(也就是main函數)
- 須要構造其執行環境;
  • Shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數,先函數調用參數傳遞,再系統調用參數傳遞。

(3)靜態連接的可執行程序和動態連接的可執行程序execve系統調用返回時不一樣

  • 靜態連接:elf_entry指向可執行文件的頭部,通常是main函數,是新程序執行的起點。

2.動態連接的可執行程序的裝載

  • 動態連接庫的依賴關係會造成一個圖。
  • load_elf_interp實際加載動態連接器,entry返回的是動態連接器的入口,根據需求加載動態連接庫,根據庫的須要再加載更多的庫。

4、實驗 Linux內核如何裝載和啓動一個可執行程序

1.下載新的代碼文件

2.運行和gdb跟蹤斷點

相關文章
相關標籤/搜索