郭皓 原創做品轉載請註明出處 《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000shell
1.可執行程序是怎麼得來的函數
c代碼->預處理->彙編代碼->彙編器->目標代碼->連接成可執行文件->加載到內核執行
佈局
2.目標文件的格式ELFspa
符號修飾標準、變量內層佈局、函數調用方式等這些跟可執行代碼二進制兼容性相關的內容稱爲ABI(Application Binary Interface)命令行
常見的ABI格式:3d
3.靜態連接的ELF可執行文件和進程的地址空間code
通常靜態連接將會把全部代碼放在同一個代碼段。orm
動態鏈接的進程會有多個代碼段。blog
1.可執行程序的執行環境進程
2.裝載時動態連接和運行時動態連接應用舉例
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.動態連接的可執行程序的裝載
4、實驗 Linux內核如何裝載和啓動一個可執行程序
1.下載新的代碼文件
2.運行和gdb跟蹤斷點