Common块和Bss段的区别

本文解析了common块在链接过程中的作用,强调了其用于存放弱符号的原因,解释了为何即使全局未初始化变量通常在.bss段,但在多文件链接时common块的重要性。同时提到了强符号和初始化的区别,以及编译器的行为。
摘要由CSDN通过智能技术生成

昨天看《程序员的自我修养——链接,装载与库》发现不是很理解为什么要用common块,然后仔细看了一番,有了自己的理解。
common块:用来存放弱符号,而全局未初始化变量是弱符号,但是难道不是应该存放在.bss段吗,为什么要有common块呢?
原因:首先链接器是无法识别符号的类型的,它支持存在多个相同的弱符号存在,但是如果存在多个相同的弱符号,没有强符号存在的情况下,会默认最大的弱符号的内存大小是我们要分配的内存。但是在多文件链接的时候,可能在其他文件中会存在相同的弱符号但是类型可能会不同,所以当一个文件中被编译时,他的弱符号大小无法被确定,因为其他文件中也会存在弱符号,但是当最后链接到一起时,他的大小可以被确认,最终还是被放在了.bss段。

这里说一下c++的全局初始化变量,有的编译器会默认给他赋值为0,所以有了初始化就是强符号,那么存在多个强符号,编译时就会出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值