在我的最后一个问题的基础上,我试图弄清楚指令如何准确地工作,特别是它们如何影响 C 中的链接和持续时间.local
。.comm
所以我进行了以下实验:
static int value;
生成以下汇编代码(使用 gcc):
.local value
.comm value,4,4
当初始化为零时产生相同的汇编代码(使用 gcc):
.local value
.comm value,4,4
这听起来合乎逻辑,因为在这两种情况下,我都希望变量将存储在 bss 段中。此外,在调查使用后ld --verbose
,看起来所有.comm
变量确实都放在了 bss 段中:
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
// ...
}
但是,当我将变量初始化为非零值时,编译器会按照我的预期在数据段中定义变量,但会产生以下输出:
.data
.align 4
.type value, @object
.size value, 4
value:
.long 1
除了之前我现在理解的不同部分(分别为 bss 和数据)之外,我的变量在第一个示例中被定义为.local
和 而.comm
在第二个示例中没有。谁能解释每个案例产生的两个输出之间的差异?