弱符号与强符号

目标文件中的符号

在链接中,将函数和变量统称为符号,函数名和变量名就是符号名。

ELF文件中符号表的符号分类:

1. 定义在本目标文件的全局符号,可以被其他目标文件引用;

2. 本目标文件中引用的全局符号,却没有定义在本目标文件中;

3. 段名,这种符号一般由编译器产生,它的值就是该段的起始地址

4. 局部符号

5. 行号信息,即目标文件指令与源代码中代码行的对应关系,它是可选的

弱符号与强符号

对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。同时,也可以通过GCC的"__attribute__((weak))"来定义任何一个强符号为弱符号。注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用。

extern int ext;

int weak;    // 弱符号
int strong = 1;  //强符号
__attribute__((weak)) weak2 = 2;  // 弱符号

int main()  // main也是强符号
{
    return 0;
}

针对强弱符号,链接器会按如下规则处理与选择多次定义的全局符号:

规则1:不允许强符号被多次定义

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

规则3:如果一个符号在所有目标文件中是弱符号,那么选择占用空间最大的一个。

弱引用与强引用

强引用:当目标文件中引用了外部符号,但是链接器在链接时却没有找到符号,链接器会直接报错,这种符号就是强引用。

弱引用:当目标文件中引用了外部符号,但是链接器在链接时却没有找到符号,链接器也不会报错,这种符号就是弱引用。

注:一般对于未定义的弱引用,链接器默认其为0,或者是一个特殊值,便于程序代码识别

在GCC中,程序可以通过使用"__attribute__((weakref))"这个扩展关键字来声明对一个外部函数的引用为弱引用,比如:

__attribute__ ((weakref)) void helloworld();

int main()
{
    if(helloworld)
    {
        helloworld();
    }
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值