【发布时间】:2012-11-27 11:14:28
【问题描述】:
在我的last question 的基础上,我试图弄清楚.local 和.comm 指令是如何工作的,特别是它们如何影响C 中的链接和持续时间。
所以我进行了以下实验:
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 而在第二个示例中没有。谁能解释每个案例产生的两个输出之间的差异?
【问题讨论】: