弱符號與強符號
對於c/c++語言來說,編譯器預設函式和初始化了的全域性變數為強符號,未初始化的全域性變數為弱符號。我們也可以通過gcc的__attribute__((weak))將乙個強符號變為弱符號。強符號和弱符號都是針對定義來說的,不是針對符號的引用。
extern
int ext;
int weak;
//弱符號
int strong =1;
//強符號
__attribute__
((weak)
) weak2 =2;
//弱符號
intmain()
弱引用與強引用目前我們看到的對外部目標檔案的符號引用在目標檔案被最終鏈結成可執行檔案時,它們必須被正確決議,如果沒有找到該符號的定義,鏈結器就會報符號為定義錯誤,這種被稱為強引用。與之相對應的還有弱引用,在處理弱引用時,如果該符號有定義,則鏈結器將該符號的引用決議;如果該符號未被定義,則鏈結器對於該引用不報錯。
我們用下面的**來驗證一下:
1.c
#include
extern
int a;
extern
void
fun();
extern
void
func()
;int
main()
2.c
#include
int a =5;
void
fun(
)
3.c
#include
int a;
void
func()
makefile檔案
main: 1.o 2.o 3.o
gcc 1.o 2.o 3.o -o main
1.o: 1.c
gcc -c 1.c
2.o: 2.c
gcc -c 2.c
3.o: 3.c
gcc -c 3.c
clean:
rm 1.o 2.o 3.o
上面是三個檔案中的**,在1.c檔案中定義了main函式,讀者可以自己判斷一下1.c檔案中列印的結果。
我們來看一下列印的結果
結果:發現列印的結果都為5,那是怎麼回事呢?解析
讀者如果想要深入了解可以看之前我寫的一篇部落格解析elf檔案。
C語言中的強符號與弱符號
參考 程式設計師的自我修養 參考 c語言中的強符號與弱符號 main.c int a 100 int main other.c int a 10 編譯 gcc main.c other.c編譯結果 ld 1 duplicate symbol for architecture x86 64 clang...
C語言中的強符號和弱符號
c語言中的強符號和弱符號 c語言真的很奇怪,各種你想不到的問題都會出現,但是仔細分析這個問題,無不很有道理,這些都不是c語言的漏洞,而是這門語言的強大之處。首先介紹一下強符號和弱符號。當多個c檔案需要一起編譯執行的時候,就會有強弱符號的問題。為什麼會有多個c檔案一起編譯呢?這就的說起鏈結linkin...
C語言中的強符號和弱符號介紹
之前在extern c 用法詳解中已經提到過符號的概念,它是編譯器對變數和函式的一種標記,編譯器對c和c 在生產符號時規則也是不一樣的,符號除了本身名字的區別外,還有強符號和弱符號之分 我們先看一段簡單的 複製 如下 test.c void hello int main 很顯然,這段 是沒法鏈結通過...