1. 程式人生 > >程式編譯和連結

程式編譯和連結

程式進記憶體的一般過程:
1、編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。
2、連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。
3、裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。

靜態可重定位裝入方式:
1、地址對映在程式執行之前進行,重定位後實體地址不再改變。
2、可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。
3、優點:不需硬體支援,可以裝入有限的多道程式。缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。

動態執行時(重定位)裝入方式:
1、實際執行中往往會需要程式在記憶體中的各位置移動,即經常需要重定位到不同的實體地址上。這種執行時移動程式要求地址變換要快速,實現時一般依靠硬體地址變換機構——一個重定位暫存器。
2、程式裝入記憶體時,可多次重定位到不同位置。且可以不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。更適用於部分裝入

靜態連結(裝入到連續的記憶體地址):
1、裝入執行前,生成可執行檔案時進行的。
2、將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。

裝入時動態連結(裝入到連續的記憶體地址):
1、由一個目標模組開始裝入,若又涉及外部模組呼叫事件,裝入程式再找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模組中的相對地址。
2、比靜態連結好在哪裡?
(1) 靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式。動態方式則便於修改和更新。
(2) 便於實現共享。靜態的N個程式都需要一個模組時,需要進行N次拷貝。

執行時動態連結(裝入到非連續的記憶體地址):
1、裝入時動態連結的問題
許多情況下,事先不知道某應用程式本次執行需要哪些模組,只能全部裝入,裝入時全部連結在一起,效率低。
2、辦法:有的模組不經常使用就暫時不裝入,執行時用到了再裝入。(如程式總不出錯,就不會用到錯誤處理模組。)即執行時動態連結:執行時,將對某些模組的連結推遲到執行時才連結裝入。
3、優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。