連結(linking)就是將不同部分的代碼和資料收集和組合成為一個單一檔案的過程,這個檔案可被載入(或被拷貝)到儲存空間並執行。連結可以執行於編譯時間(compile time),也就是在原始碼被翻譯成及其代碼時;也可以執行於載入時(load time),也就是在程式被載入器(loader)載入到儲存空間並執行時;甚至執行於運行時(run time),由應用程式來執行。
連結器在軟體開發中扮演著一個關鍵的角色,因為它們使得分離編譯(separate compilation)成為可能。我們不用將一個大型的應用程式組織為一個巨大的源檔案,而是可以把它分解為更小、更好管理的模組,可以獨立地修改和編譯這些模組。當我們改變這些模組中的一個時,我們只要簡單地重新編譯它,並將它重新連結到應用上,而不必重新編譯其他檔案。
1:理解連結器將協助你構造大型程式。構造大型程式的程式員經常會遇到由於缺少模組、缺少庫或者不相容的庫版本引起的連結器錯誤。除非你理解連結器是如何解析引用、什麼是庫以及連結器是如何使用庫來解析引用的,否則這類錯誤將令你感到迷惑和挫敗。
2:理解連結器將協助你避免一些危險的編程錯誤。Unix連結器解析符號引用時所做的決定可以不動聲色地影響你程式的正確性。在預設情況下,錯誤地定義多個全域變數的程式將通過連結器,而不產生任何警告資訊。由此得到的程式會產生令人迷惑的運行時行為,而且非常難以調試。我們將向你戰士這是如何發生的,以及該如何避免它。
3:理解連結器將協助你理解語言的範圍規則是如何?的。例如,全域和局部變數之間的區別是什嗎?當你定義一個具有靜態屬性的變數或者函數時,到底實際意味著什嗎?
4:理解連結將協助你理解其他重要的系統概念。連結器產生的可執行目標檔案在重要的系統功能中扮演著關鍵角色,比如載入和運行程式、虛擬儲存空間、分頁和儲存空間映射。
5:理解連結將使你能夠開發共用庫。多年以來,連結都被認為是相當簡單和無趣的。然而,隨著共用庫和動態串連在現代作業系統中日益加強的重要性,串連成為了一個複雜的過程,它為知識豐富的程式員提供了強大的能力。比如,許多軟體產品使用共用庫在運行時來升級壓縮封裝(shrink-wrapped)二進位程式。還有,大多數Web伺服器都依賴於共用庫的動態連結來提供動態內容。