以helloworld爲例shell
目標文件是什麼樣的?編輯器
目標文件中的內容至少有編譯後的機器指令代碼、數據。沒錯,除了這些內容之外,目標文件中還包括了連接時所需要的一些信息,好比符號表、調試信息、字符串等。函數
ELF:exectable and linkable format.可執行和可連接的格式。工具
它是文件格式的標準,可執行鏈接格式是UNIX系統實驗室(USL)做爲應用程序二進制接口(Application Binary Interface(ABI)而開發和發佈的。工具接口標準委員會(TIS)選擇了正在發展中的ELF標準做爲工做在32位INTEL體系上不一樣操做系統之間可移植的二進制文件格式。佈局
ABI和目標文件格式是怎麼回事?操作系統
ABI 又稱目標文件,應用程序二進制接口。二進制兼容的問題。複雜來說就是:命令行
- 符號修飾標準、變量內層佈局、函數調用方式等這些跟可執行代碼二進制兼容性相關的內容稱爲ABI(Application Binary Interface)。
ELF( ELF: 可執行鏈接格式 )中的三種目標文件:3d
ELF文件頭: 如何查看ELF文件的頭部調試
shiyanlou:Code/ $ readelf -h hello
code
段頭表
- 目標文件中各節的位置和大小
- 處於目標文件的末尾
- 通常靜態連接都會將全部代碼放在一個代碼段。 - 動態連接的進程會有多個代碼段。
裝載可執行程序以前的工做。 - 可執行程序的執行環境: - 命令行參數和shell環境,通常咱們執行一個程序的Shell環境,咱們的實驗直接使用execve系統調用。 - $ ls -l /usr/bin 列出/usr/bin下的目錄信息 - Shell自己不限制命令行參數的個數,命令行參數的個數受限於命令自身 - ---例如,int main(int argc, char *argv[]) - ---又如, int main(int argc, char *argv[], char envp[]) - Shell會調用execve將命令行參數和環境參數傳遞給可執行程序的main函數 - ---int execve(const char * filename,char * const argv[ ],char * const envp[ ]); - 庫函數exec都是execve的封裝例程 - - 命令行參數和環境變量是如何保存和傳遞的? - 命令行參數和環境串都放在用戶態堆棧中
- shell程序->>execve->> sys_execve - 而後在初始化新程序堆棧時拷貝進去 - 先函數調用參數傳遞,在系統調用參數傳遞
動態連接分爲可執行程序裝載時動態連接和運行時動態連接。
sysexecve內核處理過程 - sysexecve內部會解析可執行文件格式