Common块和Bss段的区别

Common块和Bss段的区别,第1张

昨天看《程序员的自我修养——链接,装载与库》发现不是很理解为什么要用common块,然后仔细看了一番,有了自己的理解。



common块:用来存放弱符号,而全局未初始化变量是弱符号,但是难道不是应该存放在.bss段吗,为什么要有common块呢?
原因:首先链接器是无法识别符号的类型的,它支持存在多个相同的弱符号存在,但是如果存在多个相同的弱符号,没有强符号存在的情况下,会默认最大的弱符号的内存大小是我们要分配的内存。


但是在多文件链接的时候,可能在其他文件中会存在相同的弱符号但是类型可能会不同,所以当一个文件中被编译时,他的弱符号大小无法被确定,因为其他文件中也会存在弱符号,但是当最后链接到一起时,他的大小可以被确认,最终还是被放在了.bss段。


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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存