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