1. 程式人生 > >符號解析

符號解析

變化 都是 如何 lock 重定義 library 成功 nbsp spa

鏈接器如何解析多重定義的全局符號

在編譯時,編譯器向會便器輸出每個全局符號,匯編器把這些信息隱含地編碼在可重定位目標文件的符號表內。函數和初始化的全局變量是強符號,未初始化的全局變量是弱符號。根據強弱符號的定義,unix鏈接器使用以下規則處理多重定義的符號:1)不允許有多個重定義符號是強符號2)如果重定義符號中多個是弱符號,一個是強符號,則選擇強符號作為該符號的定義3)如果重定義符號全是弱符號,則在這些弱符號中任選一個作為該符號的定義

鏈接器如何使用靜態庫(static library)解析引用

在符號解析階段,鏈接器按照從左到右的順序掃描在編譯驅動程序命令行上出現的可重定位目標文件(relocatable object file

)以及存檔文件(archive file)。在這個過程中,鏈接器維持一個可重定位目標文件集合E,一個未解析符號集合U,還有一個已定義符號集合D。三個集合在初始時都是空的。鏈接器按照如下步驟解析符號:

1)對於命令行上出現的每個文件,鏈接器會判斷該文件是目標文件還是存檔文件。如果是目標文件,就將該文件添加到集合E中,並更新集合U和D反映該文件的符號定義與引用情況;如果是存檔文件,那麽鏈接器就嘗試將集合U中的未解析符號與該文件中定義的符號進行匹配,如果某個未解析符號與存檔文件中的一個成員匹配成功,就將該成員文件添加到集合E,並更新集合U和D反映成員文件的符號定義與引用情況。鏈接器會對存檔文件中的所有成員目標文件反復進行這個過程,直到U和D不再變化。此時任何不包含在E中的成員目標文件都被丟棄。鏈接器接著處理下一個輸入文件。

2)如果鏈接器掃描完命令行上所有的輸入文件,而U卻是非空的,那麽鏈接器會輸出一個錯誤並終止。否則就會合並E中的所有可重定位目標文件,構建可執行目標文件。

符號解析