一、什麼是靜態庫
將多個普通目標檔案打包成為乙個單獨的檔案,稱為靜態庫。
靜態庫是為了解決以下問題而出現的:
(1)c使用者需要使用大量的c函式庫
把所有的**放在乙個.c檔案中,然後產品**一起編譯鏈結,雖然可以解決這個問題,但是不滿足(2)
(2)這些c函式需要單獨鏈結程序式,以減少空間浪費
把每個函式作為乙個.c檔案,分別編譯然後一起鏈結,雖然可以解決這個問題,但不能滿足(3)
(3)這些c函式需要作為乙個整體成為鏈結器的引數,以減少c使用者的開發難度
整個靜態庫作為鏈結器的乙個引數,但是只會把其中被引用的模組鏈結進來。
二、靜態庫的符號解析
對於廣大的碼農來說,可能寫成偽**形式更容易理解吧。
目標檔案集合 e;
符號集合 undef, defined;
object
symbolresolutionbeteenobject
void analyse(object
inputobject)
void analysenormalobject(object
f)void analyselib(object
a) }while(undef != tempu || defined != tempd)
}
三、上面演算法未提到的過程
(1)mergeandrelocation(e)
集合e中的檔案最終會經過合併和重定位而形成可執行檔案。
合併過程由於涉及到目標檔案格式,不在這裡展開。
重定位過程也不在本文中展開
(2)mergesymbols(undef, defined, f)
修改undef和defined來反映f中的符號定義和引用
具體過程涉及到目標檔案格式,不在這裡展開
四、重定義處理策略
靜態庫不會與其它目標物件出現重定義的問題。
因為當靜態庫只關心undef中有沒有它定義的符號,而不關心defined中有沒有它定義的符號。
程式設計師的自我修養(六)靜態鏈結 符號解析與重定位
符號解析與重定位是靜態鏈結的核心內容。重定位表 重定位表專門用來儲存與重定位相關的資訊,它在elf檔案中往往是乙個或多個段。用objdump r o檢視目標檔案的重定位表 每個要被重定位的地方叫乙個重定位入口。在這裡,段的重定位入口有6個。relocation records for txt 代表這...
鏈結器符號解析演算法小解以及靜態庫鏈結順序等等問題
在編寫linux驅動程式時,時常會發現鏈結出錯,當時往往不知道錯誤在哪。現在了解到鏈結器的工作原理之後,明白當時為什麼出錯了。對於以後有效率地編寫驅動程式有很大幫助。乙個c語言程式,經過諸如gcc之類的編譯器編譯成可執行檔案一般會經歷4個處理過程,這個大部分的linux入門書籍都有講到過,如果沒有扔...
鏈結器符號解析演算法小解以及靜態庫鏈結順序等等問題
一 編譯鏈結 在編寫linux驅動程式時,時常會發現鏈結出錯,當時往往不知道錯誤在哪。現在了解到鏈結器的工作原理之後,明白當時為什麼出錯了。對於以後有效率地編寫驅動程式有很大幫助。乙個c語言程式,經過諸如gcc之類的編譯器編譯成可執行檔案一般會經歷4個處理過程,這個大部分的linux入門書籍都有講到...