链接器如何解析多重定义的全局符号(强弱符号)------深入理解计算机系统

链接器如何解析多重定义的全局符号(不过我在vs2015 c++ 下发现并没有区分强弱符号,反正符号就是不能重定义。)

  1. 不允许有多个同名的强符号
  2. 如果有一个强符号和多个弱符号,那么选择强符号
  3. 如果有多个弱符号,那么从这些弱符号中任选一个
//aa.c
int x=1000;//强符号

//bb.c
int a;//弱符号
所以此时选aa.c的强符号


//cc.c
int c;

//dd.c
int c;
所以此时任选。

  规则2,3可能会造成一些问题,尤其是如果重复定义的符号定义还有不同的类型时。eg  x在一个模块中定义为int,在另一个模块中定义为double

//aa.c

int y=1;
int x=456;


//bb.c

double x;
void a()
{
  x=-0.0;

  x86-64/linux上,double是8个字节,int 是4个字节。所以在我们系统中,x的地址是0x601020,y的地址是0x601024。(栈顶在上,方向向低地址)。因此,bb.c中的赋值x=-0.0将用负0的双精度浮点表示覆盖内存中x和y的位置。

 

使用GCC-fno-common 标志,在遇到多重定义的全局符号时,触发一个错误。

使用-Werror 标志。会把所有的警告变成错误。

转载于:https://www.cnblogs.com/l2017/p/10199259.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值