所謂目標庫是這樣的一種文件:將(通常是邏輯相關的)一組函數代碼加以編譯,並置於一個文件中,供其他應用程序調用。這一做法有利於程序的開發和維護。現代UNIX提供兩種類型的對象庫:靜態庫和共享庫。
靜態庫
靜態庫是早期UNIX系統中唯一的一種目標庫。本質上說,靜態庫是對已編譯目標模塊的一種結構化整合。要使用靜態庫中的函數,需要在創建程序的鏈接命令中指定相應的庫。主程序會對靜態庫中隸屬於各自目標模塊的副本,將其復制到最終的可執行文件中,這就是所謂靜態鏈接。對於所需庫內抽取所需庫內的各自目標模塊,采用靜態鏈接方式生成的程序都存有一份副本。這會引起諸多不便。其一,在不同的可執行文件中,可能都存有相同目標代碼的副本,這是對磁盤空間的浪費。同理,調用同一庫函數的程序,若均以靜態鏈接方式生成,且又於同時加以執行,這會造成內存浪費,因為每個程序所調用的函數都各有一份副本駐留在內存中,此其二。此外,如果對庫函數進行了修改,需要重新加以編譯、生成新的靜態庫,而所有需要調用該函數“更新版”的應用,都必須與新生成的靜態庫重新鏈接。
共享庫
設計共享庫的目的是為了解決靜態庫所存在的問題。
如果將程序鏈接到共享庫,那麼鏈接器就不會把庫中的目標模塊復制到可執行文件中,而在可執行文件中寫入一條記錄,以表明可執行文件在運行時需要使用該共享庫。一旦在運行時將可執行文件載入內存,一款名為“動態鏈接器”的程序會確保將可執行文件所需的動態庫找到,並載入內存,隨後實施運行時鏈接,解析可執行文件中的函數調用,將其與共享庫中相應的函數定義關聯起來。在運行時,共享庫代碼在內存中只需保留一份,且可供所有運行中的程序使用。
經過編譯處理的函數僅在共享庫內保存一份,從而節約了磁盤空間。另外,這一設計還能確保各類程序及時使用到函數的最新版本,只需將帶有函數新定義的共享庫重新加以編譯即可,程序會在下次執行時自動使用新函數。