gcc中的强符号和弱符号、强引用和弱引用
阅读数:301 评论数: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配置项时,使用__
一、概述
1、prolog与epilog
prolog翻译过来是“序言;开端”。
epilog翻译过来是”后记;结语“。
prolog与epilog其实就是两段固定的代码,当编译器对程序进行编译的时候
在C语言编程过程中,我们常常会实现一些可变参数的函数调用(类scanf、printf函数),变参函数在我们编程过程中带来了很大的方便,但是也有一些问题,即我们在调用可变参数的函数的时候,默认情况