20135327郭皓--Linux內核分析第七週 可執行程序的裝載

 

 

第七週 可執行程序的裝載

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

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

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

 

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

2.目標文件的格式ELFspa

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

常見的ABI格式:3d

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

 

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

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

 

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

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

  • 命令行參數和shell環境,通常咱們執行一個程序的Shell環境,咱們的實驗直接使用execve系統調用。
  • Shell自己不限制命令行參數的個數, 命令行參數的個數受限於命令自身。
  • shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數。
  • 命令行參數和環境串都放在用戶態堆棧中。

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

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

 

3、可執行程序的裝載

1.可執行程序的裝載相關關鍵問題分析

execve與fork是比較特殊的系統調用

execve用它加載的可執行文件把當前的進程覆蓋掉,返回以後就不是原來的程序而是新的可執行程序起點
fork函數從ret_ from_fork開始執行而後返回用戶態

2.sys_execve內核處理過程

do_execve -> do_execve_common -> exec_binprm

do_execve
do_open_exec(filename)打開要加載的文件
命令行參數,結構體變量copy到bprm結構體中
exce_binprm(bprm),關鍵代碼是尋找能解析當前文件的處理模塊
register_binfmt($elf_format)註冊這個格式到鏈表裏,而後尋找能處理的模塊
ELF可執行文件默認映射到0x8048000這個地址
須要動態連接的可執行文件先加載鏈接器ld;不然直接把elf文件entry地址賦值給entry便可。
start_thread(regs, elf_entry, bprm->p)會將CPU控制權交給ld來加載依賴庫並完成動態連接;對於靜態連接的文件elf_entry是新程序執行的起點

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

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

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

1.下載新的代碼文件

2.運行和gdb跟蹤斷點

相關文章
相關標籤/搜索