可執行文件的格式
在 Linux 平臺下主要有如下三種可執行文件格式:
一、a.out(assembler and link editor output 彙編器和連接編輯器的輸出)
二、COFF(Common Object File Format 通用對象文件格式)
三、ELF(Executable and Linking Format 可執行和連接格式)。
在本課程中,主要介紹的是ELF文件。ELF 文件又分爲三種類型:共享目標文件(庫文件,後綴爲.so)、可執行文件、可重定位文件(目標文件,後綴爲.o)。
可執行文件的建立過程
從 C/C++ 源文件生成一個可被系統加載和啓動的可執行文件,須要通過預處理、編譯和連接這幾個過程。
預處理:把include 的文件包含進來,進行宏替換等。
編譯:編譯器將預處理文件編譯成彙編代碼;彙編器將彙編代碼編譯成目標代碼
連接:將目標代碼連接爲可執行文件。根據連接方式的不一樣,可分爲靜態連接與動態連接。動態連接又可分爲可執行程序裝載時動態連接與運行時動態連接。
預處理:加入頭文件執行宏替換等操做 gcc -E hello.c -o hello.i編輯器
編譯:檢查無誤後轉爲彙編語言 gcc –S hello.i –o hello.s函數
彙編:轉爲二進制 gcc –c hello.s –o hello.opost
連接:生成可執行文件 gcc hello.o –o hellospa
一步完成的命令爲:gcc hello.c -o hello 命令行
elf文件分爲可重定位文件、可執行文件、共享文件等調試
查看elf文件的文件頭能夠用readelform
程序的入口地址是0x8048000對象
可執行文件(ELF文件)的裝載與啓動過程
一個可執行文件是由 shell 程序啓動的。在 shell 環境下,用戶輸入可執行程序名及其參數後,shell 程序會調用 execve 將命令行參數和環境參數傳遞給可執行程序的main函數。經過如下層層調用,最終完成可執行程序的啓動過程:
do_execve-->do_execve_common-->exec_binprm-->search_binary_handler-->load_elf_binary-->start_thread
實驗:blog
gdb跟蹤內核函數sys_execve處理過程
內核準備
執行exec
gdb調試
執行結果
單步運行,能夠看到do_execv函數
執行到start_thread查看入口地址
與readelf的結果一致