【发布时间】:2020-12-18 00:18:35
【问题描述】:
我相信我的问题是不同的to this one。在这里我问为什么我们需要区分这两者,链接只回答哪个去哪个。
我们知道:
-
Common 部分用于未初始化的全局变量和
-
Bss 部分用于未初始化的静态变量和初始化为 0 的全局变量。
但是为什么要区分 BSS 和 COMMON 部分呢?特别是对于初始化为0的全局变量,我们不能将它们放在用于初始化全局变量的.data部分吗?把变量初始化为0不也是初始化吗?
以下是我教科书中的解释:
在某些情况下,链接器允许多个模块定义具有相同名称的全局符号。当编译器在翻译某个模块时遇到一个弱全局符号,比如 x,它不知道其他模块是否也定义了 x,如果是,它无法预测链接器可能选择 x 的多个实例中的哪一个。因此编译器通过将 x 分配给 COMMON 将决定推迟到链接器。另一方面,如果 x 被初始化为零,那么它是一个强符号,因此编译器可以放心地将它分配给 bss。
我真的很困惑,它说“它不知道其他模块是否也定义了x”,但是你怎么能定义一个变量两次呢?有示例代码来说明吗?
【问题讨论】: