gcc中的强符号和弱符号、强引用和弱引用

阅读数:219 评论数:0

跳转到新版页面

分类

C/C++

正文

强弱符号的链接规则

链接器会按照如下规则处理与选择被多次定义的全局符号

(1)不允许强符号被多次定义,如果有多个强符号定义,则链接器会报错

(2)如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号

(3)如果一个符呈在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。

强引用和弱引用

链接处理强引和弱引用的过程几乎一样,只是对未定义的弱相用,链接器不认为它是一个错误,一般对于未定义的弱引用,链接器默认其为0,或者是一个特殊的值,以便于程序代码能够识别。

GCC中,我们可以通过使用__attribute__((weakref))扩展关键字来声明对一个外部函数的引用为弱引用。比如下面这段代码:

__attribute__ ((weakref)) void foo();
int main()
{
    foo();
}

我们可以将它编译成一个可执行文件,GCC并不会报链接错误。但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图条用foo函数是,foo函数的地址为0,于是发生了非法地址访问的错误。一个改进的例子是:

__attribute__ ((weakref)) void foo();
int main()
{
  if (foo) foo();
}

这种弱符号弱引用对于库来说十分有用,比如库中定义的弱符号可以被用户定义的强符号所覆盖,从而使得程序可以使用自定义版本的库函数;或者程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序连接在一起时,功能模块就可以正常使用;如果我们去掉了某些功能模块,那么程序也可以正常链接,只是缺少了相应的功能,这使得程序的功能更加容易裁剪和组合。

对于弱符号(Weak Symbol)和弱引用,其都仅是GNU工具链GCC对C语言语法的扩展,并不是C本身的语言特性。




相关推荐

一、概述 GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时

文档对应gcc版本8.4 GCC原来表示GNU C Compiler,现在一脙GNU Compiler Collection。支持C、C++、Objective-C,Objecti

一、概述 1、作用 __attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

编译器中的sanitize来自于google的开源sanitizers项目,后GNU将该工具加入到GCC编译中,是查找隐藏Bug的利器。 -fsanitize=address</p

一、基本的asm 格式: asm asm-qualifiers ( AssemblerInstructions) (1)asm关键字是GNU的扩展,当编译配置项为-ansi或-std配置项时,使用__

内建函数就是编译器内部实现的函数,它们随时跟着gcc升级而变化,所以不推荐普遍的使用。使用内建函数更高效,因为它们大多以inline方式编译或者针对特定平台进行优化。 C标准库中的

在1999年的ISO C标准中,一个函数可以接收变参数,而宏定义中也可以接收变参数,例如: #define debug(for

一、概述 1、prolog与epilog prolog翻译过来是“序言;开端”。 epilog翻译过来是”后记;结语“。 prolog与epilog其实就是两段固定的代码,当编译器对程序进行编译的时候

在C语言编程过程中,我们常常会实现一些可变参数的函数调用(类scanf、printf函数),变参函数在我们编程过程中带来了很大的方便,但是也有一些问题,即我们在调用可变参数的函数的时候,默认情况

GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件