C 鏈結器弱名稱重複時鏈結的隱患

2021-08-06 03:40:29 字數 388 閱讀 6531

對於多個cpp中存在相同弱名稱的情況下,g++鏈結的時候是不會提示錯誤的。

只有當兩個cpp中都存在強名稱a都時候,鏈結才會出錯。

針對第二條,這個規則會引發乙個比較嚴重的隱患。 例如

a.cpp

#include "b.cpp"

int a = 10;

int b= 20;

int main()

b.cpp

double a;

void fun()

這種情況下,b.cpp中都a引用了a.cpp中int a的位址,因此func中對於double a都操作會影響到a.cpp中int a和int b兩個變數的值,還是挺危險的,最主要還不是很容易查到這樣的bug,特別是在大型工程中。

C 鏈結時重複定義

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

C語言 從C 中鏈結時的C符號的處理

from wiki 最常見的c 慣常的做法 ifdef cplusplus extern c endif 這種寫法用於確保下符號是未被c 編譯器名字修飾過的 這種 能使得c 編譯器編譯出的二進位制目標 中的鏈結符號是未經過c 名字修飾過的,就像c編譯器一樣。就像c語言定義是未名字修飾過的一樣,c 編...

學習編譯和啟動時鏈結器所做的事

聯結器,我的理解是將高階語言編譯成二進位制檔案在記憶體中執行的中間橋梁,最主要的作用是將符號繫結到位址上.ios用的是llvm low level virtual machine 編譯器,編譯器可以將 編譯成二進位制並在記憶體中執行,這樣可以極大提公升程式執行的速度.同時缺點在於除錯週期比較長.每次...