弱符号
外观
![本页使用了标题或全文手工转换](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
弱符号(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;
参考
[编辑]- ^ Drepper, Ulrich. weak handling. 2000-06-07 [2016-05-31]. (原始内容存档于2019-09-27).
- ^ GCC Manual, 6.58.9 Weak Pragmas. [2016-05-31]. (原始内容存档于2021-04-22).
- ^ GCC Manual, 6.30 Declaring Attributes of Functions. GNU. [2013-05-29]. (原始内容存档于2021-04-22).
- ^ GCC Manual, 6.36 Specifying Attributes of Variables. [2016-05-31]. (原始内容存档于2021-04-22).
- ^ Oracle Solaris Studio 12.3: C User's Guide, 2.11.27 weak. [2016-05-31]. (原始内容存档于2020-08-03).
- ^ Oracle Solaris Studio 12.3: C User's Guide, 2.9 Supported Attributes. [2016-05-31]. (原始内容存档于2022-06-23).
- ^ Oracle Solaris 11 Express 11/10 Linker and Libraries Guide, 2.11 Weak Symbols. [2016-05-31]. (原始内容存档于2022-01-20).