gpt4 book ai didi

c - C 中的局部变量和静态变量(续)

转载 作者:行者123 更新时间:2023-12-04 05:22:13 27 4
gpt4 key购买 nike

建立在我的 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 和 data),多亏了你之前的帮助,我现在明白了,我的变量被定义为 .local.comm在第一个例子中但不是在第二个例子中。谁能解释每个案例产生的两个输出之间的差异?

最佳答案

.local指令将符号标记为本地的、非外部可见的符号,如果它不存在则创建它。 0 初始化的局部符号是必需的,因为 .comm声明但不定义符号。对于 1 初始化的变体,符号本身( value: )声明了符号。

使用 .local.comm本质上是一个黑客(或至少是一个速记);另一种方法是将符号放入 .bss明确地:

        .bss
.align 4
.type value, @object
.size value, 4
value:
.zero 4

关于c - C 中的局部变量和静态变量(续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com