編譯鏈結過程(一)

2021-06-26 13:50:45 字數 610 閱讀 8223

什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?

在很久以前,計算機發展的初期,還在用機器語言編寫程式,**量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言**涉及很多計算機執行的細節,這些程式設計師可能不需要關注。高階語言的發明,極大的提高了程式設計師寫程式的效率,也使得程式設計師從繁雜的機器相關的細節中解放出來。但是這些細節還是要有人來做,經濟的方法是通過程式來自動化實現從高階語言到低階語言(也即機器語言)的轉化,這就是編譯的主要作用。因此編譯器的複雜程度是由,高階語言的語法/語義規則和cpu的指令系統決定的。編譯過程分為好幾個步驟,每步完成不同的功能,降低編譯器實現的複雜度和可維護性:預編譯,語法分析,語義分析,目標**生成。每一步的具體內容下面會介紹。

鏈結,是由於程式規模變大以後,為方便管理,使程式模組化。即將程式劃分成乙個個功能模組,提高程式的復用性(在高階語言裡就是函式)。因為各模組是單獨編譯的,當程式呼叫其他模組裡的函式時,如何知道這些函式的具體位址呢?鏈結器就是為了解決這個問題的。這裡需要支援鏈結的機制做保證,才能正確鏈結。這裡面就有乙個概念叫重定位,每個編譯後的模組都有重定位入口。這些需要重定位的地方就是涉及到呼叫外部符號。

編譯鏈結過程

在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...

編譯鏈結過程(二)

前一篇博文提到編譯的幾個步驟,這一篇來了解下具體每一步都幹了些什麼,好叫心裡有數。詳細的過程,我想只有通過分析乙個具體的編譯器 才好。下面介紹的幾個步驟完成了原始碼檔案經過編譯鏈結後成為可執行檔案 預編譯後的檔案,不再包含注釋,標頭檔案也插入進來,條件編譯也得到相應的處理。那麼,剩下的就是實實在在的...

程式編譯,鏈結過程

c語言的編譯鏈結過程要把我們編寫的乙個c程式 源 轉換成可以在硬體上執行的程式 可執行 需要進行編譯和鏈結。編譯就是把文字形式源 翻譯為機器語言形式的目標檔案的過程。鏈結是把目標檔案 作業系統的啟動 和用到的庫檔案進行組織形成最終生成可載入 可執行 的過程。過程 如下 預處理器 將.c 檔案轉化成 ...