靜態庫的符號解析和重定義處理策略

2021-07-01 21:58:22 字數 1037 閱讀 5277

一、什麼是靜態庫

將多個普通目標檔案打包成為乙個單獨的檔案,稱為靜態庫。

靜態庫是為了解決以下問題而出現的:

(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入門書籍都有講到...