呂鬆鴻 原創做品轉載請註明出處 《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000shell
c代碼->預處理->彙編代碼->彙編器->目標代碼->連接成可執行文件->加載到內核執行
函數
符號修飾標準、變量內層佈局、函數調用方式等這些跟可執行代碼二進制兼容性相關的內容稱爲ABI(Application Binary Interface)佈局
常見的ABI格式:spa
通常靜態連接將會把全部代碼放在同一個代碼段。命令行
動態鏈接的進程會有多個代碼段。3d
命令行參數和shell環境,通常咱們執行一個程序的Shell環境,咱們的實驗直接使用execve系統調用。
Shell自己不限制命令行參數的個數, 命令行參數的個數受限於命令自身。
shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數。
命令行參數和環境串都放在用戶態堆棧中。
動態連接分爲可執行程序裝載時動態連接和運行時動態連接
通常是地址空間爲0x8048000或0x8048300
execve和fork都是特殊一點的系統調用:通常的都是陷入到內核態再返回到用戶態。
fork兩次返回,第一次返回到父進程繼續向下執行,第二次是子進程返回到ret_from_fork而後正常返回到用戶態。code
execve執行的時候陷入到內核態,用execve中加載的程序把當前正在執行的程序覆蓋掉,當系統調用返回的時候也就返回到新的可執行程序起點。blog
- 執行到可執行程序 -> 陷入內核 - 構造新的可執行文件 -> 覆蓋掉原可執行程序 - 返回到新的可執行程序,做爲起點(也就是main函數) - 須要構造其執行環境;