鏈結過程是由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠按作業系統裝入執行的統一整體。
根據開發人員指定的同庫函式的鏈結方式的不同,鏈結處理可分為兩種:
1)靜態鏈結
在這種鏈結方式下,函式的**將從其所在地靜態鏈結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,其中的每個檔案含有庫中的乙個或者一組相關函式的**。
2) 動態鏈結
在此種方式下,函式的**被放到稱作是動態鏈結庫或共享物件的某個目標檔案中。鏈結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應程序的虛位址空間。動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**。
編譯器工作過程
原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。比如,下面這段原始碼 假定檔名叫做test.c 要先用編譯器處理一下,才能執行。這些命令到底在幹什麼?大多數的書籍和資料,都語焉不詳,只說這樣就可以編譯了,沒有進一步的解釋。本文將介紹編譯器的工作過程,也就是上面這三個命令各自的任務。我主要...
編譯器的工作過程
日期 2014年11月11日 原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。比如,下面這段原始碼 假定檔名叫做test.c include int main void 要先用編譯器處理一下,才能執行。gcc test.c a.out hello,world 對於複雜的專案,編譯過程還必...
編譯器的工作過程
日期 2014年11月11日 原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。比如,下面這段原始碼 假定檔名叫做test.c include int main void 要先用編譯器處理一下,才能執行。gcc test.c a.out hello,world 對於複雜的專案,編譯過程還必...