#include int main()
這段**估計大家都可以盲打下來了,我們分析一下**成分。第一句#include 是包含標頭檔案的命令,這裡不是我們的重點暫時掠過。然後是main函式,這是我們程式的入口,接下來到了乙個printf函式。好了,大家有沒有想過這個printf函式是從**來的呢?我們都知道函式有宣告、定義、呼叫這幾個過程。printf的定義在include進來的庫函式中已經完成了。我們的程式中也有了對printf的呼叫。那麼其定義在**呢?這就是我們鏈結的意義所在了。我們知道,其實類似printf這種api的底層實現是比較複雜的,如果每個程式設計師在輸出「hello world」的時候都需要重寫一遍api那麼程式設計無疑是痛苦的。所以系統為我們提供了一系列的庫函式,我們直接呼叫就可以了。
大家如果注意觀察的話就能發現,我們的c程式在vc編譯後會出現.obj的檔案,在linux下會出現.o檔案。這些檔案我們稱之為目標檔案,拿上面的helloworld程式來說,在其目標檔案狀態時,雖然其內部構造和可執行檔案差不多,不過他還是無法執行的,因為其缺少鏈結這個過程。
這裡我們簡單說一下他們的根本區別,動態鏈結的話在可執行檔案中找不到printf的實現**,其**會在裝載的時候引導程式的虛擬位址空間(關於虛擬位址概念可以看我前面的文章)。靜態鏈結則會把printf的**也鏈入可執行檔案。大家記到這裡也就差不多了。
今天的第一篇寫的比較淺顯,主要和大家闡述一下鏈結的概念和過程。下面一篇我將會給大家分享關於靜態鏈結的時候hellworld.o的**和靜態鏈結庫的內容是如何整合、索引、修正的。希望大家可以多多支援!
程式編譯,鏈結過程
c語言的編譯鏈結過程要把我們編寫的乙個c程式 源 轉換成可以在硬體上執行的程式 可執行 需要進行編譯和鏈結。編譯就是把文字形式源 翻譯為機器語言形式的目標檔案的過程。鏈結是把目標檔案 作業系統的啟動 和用到的庫檔案進行組織形成最終生成可載入 可執行 的過程。過程 如下 預處理器 將.c 檔案轉化成 ...
編譯鏈結過程(一)
什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...
程式的彙編,鏈結過程
code.c源 彙編檔案包含各種宣告,包括以下幾行 每個 對應一句彙編指令。使用 c 命令產生目標 檔案code.o,因為是二進位制檔案,所以無法檢視。不過,要檢視目標 的內容,可以使用反彙編器 disassembler 在linux系統中,帶 d 命令列標誌的程式objdump可以充當這個角色.注...