弱符號(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).