弱符號(Weak symbol)是鏈接器在生成ELF文件的過程中使用的一種特殊屬性符號。默認情況下,如果沒有特別聲明,目標文件裡面的符號都是強符號。在鏈接過程中,一個強符號會優先於一個同名的弱符號。相比之下,兩個同名強符號一起鏈接會出現鏈接錯誤。當鏈接一個可執行文件,弱符號可以不定義。但對於強符號,如果沒有定義,連接器會產生一個「符號未定義」錯誤 (undefined symbol)。使用弱符號的目的是,當不確定這個符號是否被定義的情況下,鏈接器也可以成功鏈接出ELF文件,適用於某些模塊還未實現的情況下,其他模塊的先行調試。 弱符號在C語言和C++語言的規範裡面沒有被提及,所以使用弱符號的代碼,移植性不是非常好。[1]

語法

編輯

GCC和Solaris Studio C對於弱符號使用相同的聲明, # pragma weak 或者使用函數或變量的屬性聲明 , __attribute__((weak))。[2][3][4][5][6][7]


Pragma 方式

編輯
// function declaration
#pragma weak power2
int power2(int x);

Attribute 方式

編輯
// function declaration
int __attribute__((weak)) power2(int x);
// or
int power2(int x) __attribute__((weak));
// variable declaration;
extern int __attribute__((weak)) global_var;

參考

編輯
  1. ^ Drepper, Ulrich. weak handling. 2000-06-07 [2016-05-31]. (原始內容存檔於2019-09-27). 
  2. ^ GCC Manual, 6.58.9 Weak Pragmas. [2016-05-31]. (原始內容存檔於2021-04-22). 
  3. ^ GCC Manual, 6.30 Declaring Attributes of Functions. GNU. [2013-05-29]. (原始內容存檔於2021-04-22). 
  4. ^ GCC Manual, 6.36 Specifying Attributes of Variables. [2016-05-31]. (原始內容存檔於2021-04-22). 
  5. ^ Oracle Solaris Studio 12.3: C User's Guide, 2.11.27 weak. [2016-05-31]. (原始內容存檔於2020-08-03). 
  6. ^ Oracle Solaris Studio 12.3: C User's Guide, 2.9 Supported Attributes. [2016-05-31]. (原始內容存檔於2022-06-23). 
  7. ^ Oracle Solaris 11 Express 11/10 Linker and Libraries Guide, 2.11 Weak Symbols. [2016-05-31]. (原始內容存檔於2022-01-20).