說明:
在UNIX 的應用開發中,靜態庫和動態庫都是我們經常用到的技術,有必要對這兩個概念及其原理做一些介紹。
靜態庫 靜態庫是一些目標文件的集合,通常為后綴為.o 的文件,通過ar 工具打包而成,命名格式為libxxx.a ,其中xxx 為給定的靜態庫文件名,如libm.a ,為數學函數庫,用戶也可以命名自己的庫。在創建可執行程序的過程中,靜態庫同時被鏈接到程序代碼,被主程序調用的函數目標文件連同主程序組合成單一的可執行程序。靜態庫只在程序鏈接時起作用,最終的執行程序脫離靜態庫運行。 動態庫 按照其英文(shared library )也可理解為共享庫,動態庫的后綴一般為.so ,通過編譯器生成,在不同的平臺有不同的生成方法,但是在UNIX 平臺中,其使用及工作原理是一致的。使用動態庫創建執行程序,分為兩個階段:鏈接階段,即通過ld 創建執行程序時,鏈接編輯器會在指定的動態庫中搜索、解析被主程序調用的函數及其他變量等,如引用被找到,則在執行程序的XCOFF 頭結構的loader 區域,建立包含引用的動態庫的影像,反之,如在指定的動態庫中沒有找到此引用的定義,編譯器會給出類似未定義的符號引用錯誤。這不同于靜態庫,包含引用的目標文件并不和執行程序鏈接在一起。另一階段為運行階段,即執行程序運行時。程序運行時,系統相關模塊將讀取定義執行程序的XCOFF 頭結構中的信息,查找并加載相關的動態庫,假設,所有被應用的動態庫都被定位且加載后,程序將開始運行。反之,如果,被應用的動態庫丟失,則程序報錯。這一個過程我們常稱之為動態鏈接。可以通過一個簡單的例子來分析靜態庫與動態庫的不同,假定執行程序名為a.out ,分別通過 靜態庫和動態庫編譯、鏈接,如下圖所示: ![]() 上圖,明顯的顯示出對同一主程序代碼,使用靜態庫和動態庫,創建的執行程序的不同,尤其是程序大小。對使用動態庫的程序,程序啟動后,相關的動態庫的目標代碼加載到系統內存,而且可以被其他使用此動態庫的執行程序共享使用。這樣,在給定的時間,統一動態庫的代碼在系統中只有一份拷貝,所有使用此動態庫的程序可共享這一拷貝。動態鏈接的使用可以節省系統內存的使用,對一些比較復雜的應用作用比較明顯,另外,執行程序代碼的減小,也可以節省磁盤空間。另外,我們還應當注意,AIX 不同于其他UNIX 的一點是動態庫(Shared Library )和動態對象(Shared Object ),這兩個概念不能完全互換,動態對象只是單個的目標文件,但在其XCOFF 頭結構中有一特殊標示位SRE (Shared REusable ),后綴為.o 。動態庫則是目標文件的集合,包含動態對象、普通目標文件,其后綴為.so 。
以上我們只是介紹靜態庫和動態庫的基本工作原理。 |
|