bss和数据段中的整数变量大小

时间:2014-01-15 06:44:27

标签: c linux memory-management operating-system

我正在使用测试程序来理解linux 6.3上的C内存模型,内核版本为2.6.32-279.el6.x86_64。

首先我编译下面的代码,

#include <stdio.h>
int main(void)
{
    static int i = 100; /* Initialized static variable stored in DS*/
    return 0;
}

on running size命令,我在下面,

[root@rachitjain jan14]# size a.out
   text    data     bss     dec     hex filename
   1040     488      16    1544     608 a.out

然后,在删除静态变量'i'的初始化后,我的代码变为,

include <stdio.h>
int main(void)
{
    static int i ;
    return 0;
}

在上面编译后运行尺寸,

[root@rachitjain jan14]# size a.out
   text    data     bss     dec     hex filename
   1040     484      24    1548     60c a.out

bss部分有8个字节的增量,但数据部分只减少了4个字节。移动到bss段时为什么大小是整数加倍?

我已经测试了这个角色并浮动,观察到同样的行为。

1 个答案:

答案 0 :(得分:4)

看,答案是.bss部分要求在64位上对齐,而.data没有这个要求。

你怎么看?在构建程序时,ld使用默认的链接描述文件来构建程序。如果添加-Wl,-verbose:

,则可以看到它
g++ main.cpp -Wl,-verbose

当您构建64位应用程序时,这是.bss部分的默认对象:

  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }

正如您所看到的,ALIGN(. != 0 ? 64 / 8 : 1);告诉我们要对齐8个字节

当您构建32位应用程序(g ++ -m32 main.cpp -Wl,-verbose)时,这是.bss部分的默认对象:

  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 32 / 8 : 1);
  }

您的.data部分显然在默认链接描述文件中没有任何ALIGN命令:

  .data           :
  {
    *(.data .data.* .gnu.linkonce.d.*)
    SORT(CONSTRUCTORS)
  }

有用的链接: