繁体   English   中英

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

[英]Local and static variables in C (cont'd)

基于我的最后一个问题,我试图弄清楚.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

由于安全原因,Linux 内核在分配后将进程的虚拟内存归零。 因此,编译器已经知道内存将被零填充并进行优化:如果某个变量初始化为 0,则无需在可执行文件中为其保留空间( .data部分实际上在 ELF 可执行文件中占用了一些空间,而.bss部分仅存储其长度,假设其初始内容为零)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM