我們的源代碼通過預處理,編譯,匯編,鏈接后形成可執行文件,那么當我們在終端敲下指令$ ./a.out argv1 argv2
后,操作系統是怎么將我們的可執行文件加載并運行的呢?
首先知道,計算機的操作系統的啟動程序是寫死在硬件上的,每次計算機上電時,都將自動加載啟動程序,之后的每一個程序,每一個應用,都是不斷的 fork 出來的新進程。那么我們的可執行文件,以linux 系統為例,也是由shell 進程 fork 出一個新進程,在新進程中調用exec函數裝載我們的可執行文件并執行。
可執行文件格式ELF
可執行文件需要被內核運行,自然需要遵守一定的規范。
Linux下標準的可執行文件格式是ELF。ELF(Executable and Linking Format)是一種對象文件的格式,用于定義不同類型的對象文件(Object files)中都放了什么東西、以及都以什么樣的格式去放這些東西。它自最早在 System V 系統上出現后,被 UNIX 世界所廣泛接受,作為缺省的二進制文件格式來使用。
但是linux也支持其他不同的可執行程序格式, 各個可執行程序的執行方式不盡相同, 因此linux內核每種被注冊的可執行程序格式都用linux_bin_fmt來存儲, 其中記錄了可執行程序的加載和執行函數。
-
st