我們知道,可執行檔案中的**段和資料段都是由輸入的目標檔案中合併而來的。那麼鏈結器是如何將它們的各個段合併到輸出檔案?或者說,輸出檔案中的空間如何分配給輸入檔案的。
最簡單的方案就是直接將各個目標檔案依次合併,但是這樣做輸出檔案將會有很多零散的段。這種做法非常浪費空間,因為每個段都需要有一定的位址和空間對齊要求,造成空間大量的內部碎片。
乙個更實際的方法是將相同性質的段合併到一起。
「位址和空間」其實有兩個含義:第乙個是在輸出的可執行檔案中的空間;第二個是在裝載後的虛擬位址中的虛擬位址空間。使用這種方法的鏈結器一般都採用一種叫兩步鏈結(two-pass linking)的方法。對於有實際資料的段,它們在檔案中和虛擬位址中都要分配空間,因為它們在這兩者中都存在;
對於".bss"這樣的段,分配空間的意義值侷限於虛擬位址空間,因為它在檔案中並沒有內容。
第一步 空間與位址分配:掃瞄所有的輸入目標檔案,獲得它們的各個段的長度、屬性和位置,並且將輸入目標檔案中的符號表中所有的符號定義和符號引用收集起來,統一放到乙個全域性符號表。這一步中,鏈結器將能夠獲得所有輸入目標檔案的段長度,並且將它們合併,計算出輸出檔案中各個段合併後的長度與位置,並建立對映關係。
第二步 符號解析與重定位:使用上面第一步中收集到的所有資訊,讀取輸入檔案中段的資料、重定位資訊,並且進行符號解析與重定位、調整**中的位址等。事實上第二步是鏈結過程的核心,特別是重定位過程。
記憶體位址空間與分配
在32計算機中,它的最大記憶體容量是2 32次方 4個gb大小 它是由無符號整形從0 4gb順序構成。0位址對應乙個儲存單元 8bit 1位址也對應乙個儲存單元 8bit 以此類推。如果乙個資料對應的位址是0 3位址,那麼它佔3個儲存單元,也就是3個位元組。由於32位微機的位址匯流排寬度為32位,所...
windows 位址空間分配
當系統建立乙個程序同時為其建立它位址空間時,此位址空間中大部分都是閒置的。為了使用這部分位址空間,我們必須呼叫virtualalloc來分配其中的區域。分配區域的操作被稱為預定。當應用程式預定位址空間區域時,系統會確保預定的區域的起始位址正好是分配粒度的整數倍。分配粒度根據不同的平台而有所不同。現在...
windows 位址空間分配
當系統建立乙個程序同時為其建立它位址空間時,此位址空間中大部分都是閒置的。為了使用這部分位址空間,我們必須呼叫virtualalloc來分配其中的區域。分配區域的操作被稱為預定。當應用程式預定位址空間區域時,系統會確保預定的區域的起始位址正好是分配粒度的整數倍。分配粒度根據不同的平台而有所不同。現在...