強符號和弱符號

2021-08-14 09:32:27 字數 1442 閱讀 5554

在c語言中,函式和初始化的全域性變數(包括顯示初始化為0)是強符號,未初始化的全域性變數是強符號。關於多個強弱符號定義型別不一致的主要有下面三種情況:

1.兩個或兩個以上強符號型別不一致

2.有乙個強符號,其他都是弱符號

3.兩個或兩個以上弱符號型別不一致

對於情況一,編譯會報符號重定義錯誤。

[mapan@localhost 2]$ cat a.c 

#include int shared;

int main()

[mapan@localhost 2]$ cat b.c

#include int shared = 2;

void swap(int *a,int *b)

[mapan@localhost 2]$ gcc a.c b.c

[mapan@localhost 2]$ ./a.out

a = 200

[mapan@localhost 2]$

[mapan@localhost 2]$ cat a.c 

#include long shared = 1;

int main()

[mapan@localhost 2]$ cat b.c

#include int shared ;

[mapan@localhost 2]$ gcc a.c b.c

[mapan@localhost 2]$ ./a.out

1[mapan@localhost 2]$

編譯正常。這是強類符號的大小大於弱型別符號大小。再看:

[mapan@localhost 2]$ cat a.c 

#include long shared ;

int main()

[mapan@localhost 2]$ cat b.c

#include int shared = 1;

[mapan@localhost 2]$ gcc a.c b.c

/usr/bin/ld: warning: alignment 4 of symbol `shared' in /tmp/ccnlfnup.o is smaller than 8 in /tmp/ccp5hfsc.o

/usr/bin/ld: warning: size of symbol `shared' changed from 8 in /tmp/ccp5hfsc.o to 4 in /tmp/ccnlfnup.o

[mapan@localhost 2]$ ./a.out

1[mapan@localhost 2]$

編譯產生警告資訊,這是因為2個目標檔案的common塊不一致(未初始化的全域性變數存放在common塊)。當不同的目標檔案需要common塊空間大小不一致時,以最大的那塊為準。

對於情況三,編譯正常,沒啥好說的了。

C 強符號和弱符號

1 不允許強符號被多次定義,也即不同的目標檔案中不能有同名的強符號 如果有多個強符號,那麼鏈結器會報符號重複定義錯誤。2 如果乙個符號在某個目標檔案中是強符號,在其他檔案中是弱符號,那麼選擇強符號。3 如果乙個符號在所有的目標檔案中都是弱符號,那麼選擇其中占用空間最大的乙個。在 gcc 中,可以通過...

13 強符號和弱符號

我們在編寫 的過程中經常會遇到一種叫做符號重複定義 multiple definition 的錯誤,這是因為在多個原始檔中定義了名字相同的全域性變數,並且都將它們初始化了。例如,在 a.c 中定義了全域性變數 global int global 10 在 b.c 中又對 global 進行了定義 i...

ARM 強符號與弱符號 強引用和弱引用

強符號與弱符號 可以通過使用 attribute weakref 這個擴充套件關鍵字來宣告對乙個外部函式的引用為弱引用 這種弱符號和弱引用對於庫來說十分有用,比如庫中定義的弱符號可以被使用者定義的強符號所覆蓋,從而使得程式可以使用自定義版本的庫函式 或者程式可以對某些擴充套件功能模組的引用定義為弱引...