C語言 強符號與弱符號

對於C語言來說,編譯器默認函數和初始化的全局變量爲強符號,未初始化的全局變量爲弱符號(C++並沒有將未初始化的全局符號視爲弱符號)。可以通過GCC的"__ attribute ((weak))"來定義任何一個強符號爲弱符號,可以使用nm查看一個目標文件中的符號類型。 attribute__ ((weak))只對鏈接器有效,對編譯器不起作用,編譯器不區分強符號和弱符號,只要在一個源文件中定義兩個相同的符號,不管它們是強是弱,都會報“重複定義”錯誤。

  1. 不同的目標文件中不能有同名的強符號,否則不能鏈接在一起,編譯器報"重複定義"錯誤。
  2. 允許一個強符號和多個弱符號,但定義會選擇強符號的。
  3. 當有多個弱符號相同時,默認的,鏈接器使用第一個找到的符號。
extern int ext;
int weak1;
int strong = 1;
int __attribute__((weak)) weak2 = 2;

int main()
{
	return 0;
}

上面這段程序中,"weak"和"weak2"是弱符號,"strong"和"main"是強符號,而"ext"既非強符號也非弱符號,因爲它是一個外部變量的引用。

void __attribute__((weak)) f();
int main(void)
{
        if (f)
        f();
        return 0;
}

聲明瞭一個符號f(),屬性爲weak,但並不定義它,這樣,鏈接器會將此未定義的weak symbol賦值爲0,也就是說f()並沒有真正被調用,試試看,去掉if條件,肯定core dump!
如果我們在另一個文件中定義函數f,與week.c一起編譯鏈接,那麼函數f就會正確的被調用。

發佈了55 篇原創文章 · 獲贊 3 · 訪問量 6633
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章