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