關於鏈結時符號的定義

2021-09-27 13:34:46 字數 1322 閱讀 3410

我想就編譯器向彙編器輸出的全域性符號強弱問題進行一定的深度**,目前我們知道的是,函式和已初始化的全域性變數是強符號,未初始化的全域性變數是若符號。進行一定的實驗,看看鏈結時強弱符號重名時看看是怎麼定義的。

1.兩強函式

2兩.強全域性變數

3.一強全域性變數與一弱全域性變數

4兩弱全域性變數

1.當foo1.c和bar1.c中有相同的函式名(強符號)main()時,編譯執行的結果為:

分析:會產生一條錯誤資訊,因為強符號main()已被定義過一次

2.當foo2.c和bar2.c中有兩個同名的已賦值的全域性變數(強符號)時,編譯執行的結果為:

分析:會產生一條錯誤資訊,因為強符號x已被定義過一次

3.當foo3.c中已賦值的x(強符號)遇上bar3.c中未賦值的x(弱符號)時,編譯的結果為:

分析:強符號x的值被定義,但是弱符號模組中的f()將x的值改變為15212

4.當foo4.c和bar4.c中有兩個未賦值的全域性變數x時,編譯的結果為:

分析:兩次鏈結的位址不同,說明呼叫了不同模組的的x。

規則1:不允許有多個重名的強符號

規則2:如果有乙個強符號和乙個弱符號同名時,選擇強符號

規則3:如果有多個弱符號同名,那麼從這些弱符號中任意選乙個

C 鏈結時重複定義

因為在標頭檔案中有 ifndef define endif 所以在編譯的時候,標頭檔案不會被重複包含,不會出現重定義的問題。但是如果標頭檔案中有函式的定義,那麼不同cpp檔案都包含這個標頭檔案,在彙編成.o檔案後,不同的.o檔案中都含有標頭檔案中函式的定義,鏈結階段就會出現重定義的問題。如果出現這種...

鏈結時出現無法解析的外部符號排錯

鏈結時出現 無法解析的外部符號,錯誤資訊 cpp編譯出的符號 batviewdlg.obj error lnk2001 unresolved external symbol unsigned char stdcall getpwrcapabilities struct system power ca...

關於硬鏈結和軟連線(符號鏈結)的區別

和linux系統下提供ln指令來進行檔案鏈結。檔案鏈結主要分為硬鏈結和軟鏈結。硬鏈結 由於linux下的檔案是通過索引節點 inode 來識別檔案,硬連線不會建產新的inode,硬連線不管有多少個,都指向的是同乙個inode節點,只是新建乙個hard link會把結點連線數增加,只要結點的連線數不是...