程式編譯的過程中就是將使用者的文字形式的源**(c/c++)轉化成計算機可以直接執行的機器**的過程。主要經過四個個過程:
預編譯程式所完成的基本上是對源程式的“替代”工作。經過此種替代,生成一個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案(.i)。
預處理中替代的內容為
巨集定義#include檔案包含
條件編譯
特殊符號
將預編譯生成的檔案(.i)轉變成彙編**(.s)。這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把**翻譯成組合語言(.s)。
由彙編器將彙編**(.s)轉變成目標**(.o)。彙編過程實際上指把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。
由連結器將**在執行過程用到的其他目標**和庫檔案連結成為一個可執行程式也就是目標程式(.exe、.elf、.axf等)。
由彙編程式生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個原始檔中的函式可能引用了另一個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經連結程式的處理方能得以解決。
連結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在一個檔案中引用的符號同該符號在另外一個檔案中的定義連線起來,使得所有的這些目標檔案成為一個能夠被作業系統裝入執行的統一整體。
在這種連結方式下,函式的**將從其所在的靜態連結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬地址空間中。靜態連結庫實際上是一個目標檔案的集合,其中的每個檔案含有庫中的一個或者一組相關函式的**。
在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。
動態連結程式將根據可執行程式中記錄的資訊找到相應的函式**。
使用動態連結能夠使最終的可執行檔案比較短小,並且當共享物件被多個程序使用時能節約一些記憶體,因為在記憶體中只需要儲存一份此共享物件的**。
但並不是使用動態連結就一定比使用靜態連結要優越。在某些情況下動態連結可能帶來一些效能上損害。
啟動程序流程
linux啟動程序時設定了cs esp等各個暫存器的值,這是相應的巨集 void start thread struct pt regs r...
什麼是程序,程序呼叫的流程
我們先了解一個概念。 在linux系統中,觸發任何一個事件時,系統都會將它定義成為一個程序,並且給予這個程序一個id,稱為pid,同時依據觸...
程序程式替換流程
用fork建立子程序後執行的是和父程序相同的程式 但有可能執行不同的 分支 子程序往往要呼叫一種exec函式以執行另一個程式。 當程序呼叫一...