2007/09/25

L&L memo

Linker & loader 的基本工作是將抽象的名字和更具體的名字綁在一起...
換句話說,  這可以讓程式設計師用比較抽象的表示方法寫程式.

歷史的觀點

早期的程式都要用machine language寫. 程式設計師先用比較抽象的語法寫在紙上之後,
再用"手動"的方式轉成machine language. 再放到電腦裡面跑. 如果一個變數要加減的話,
程式設計師需要自己指定位置.
後來,指定位置的動作交給了assemblers, 於是不用在指定位置,但是如果程式改變的話,
當然還是要再重新編譯.

1947年, John Mauchly 寫了loading programs, relocation and library search.
這程式比assembler還要早出現. The relocating loader允許每個副程式從位置
零的地方開始執行, 而把實際上要執行的位置延遲到此副程式被呼叫的時候才決定.

在operating system出現之前, 程式可以被寫在固定的位置, 因為每個位置都是available的.
但是有OS之後, 程式必須和OS or other programs分享記憶體空間. 這代表著程式沒有辦法
知道哪些記憶體位置是空的, 直到程式被載入記憶體的時候才能確定. 因此linker和loader有
各自的工作了. Linker負責一部份的address binding,指定相對位置(relative addresses)給程式.
而Loader則做最後的relocation步驟-- 指定實際位置(actual addresses).

後來, 當程式越來越大, 甚至超過可以使用的記憶體空間的時候, linkers提供了overlays的功能.
可以讓程式設計師將一個程式中不同部分使用同樣的記憶體位置. 這種方法還是被使用在一些
memory-limited embedded環境中.

既然有了hardware relocation 和 virtual memory的出現, linkers 和 loaders的工作就變的比較簡單. 因為每個程式又可以有一整個記憶體空間. 程式可以被載入到固定的記憶體位置. Hardware
relocation將所有load-time relocation的工作包辦. 然而, 有hardware relocation的電腦上通常都
會在同一時間執行多個程式, 而且常會執行相同的程式. 當電腦跑多個相同的程式的時候, 有些
部分的程式碼是不會變動的, 而有些是會在執行的時候改變. 將這兩種變數區分出來的話(one
section for read-only code and another section for writable data), 可以節省許多記憶體空間.

另外, full-fledged dynamic linking, 將指定位置的工作延遲到第一次被呼叫的時候. 可以在程式
執行的期間才bind to library, loading libraries in the middle of program execution. 就像是MS的
Dynamically linked libraries (DLLs).