在bss和数据段中的整数variables大小

我正在使用一个testing程序来理解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; } 

在运行大小命令,我下面,

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

然后,删除静态variables“我”的初始化后,我的代码变成,

 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个字节减less。 为什么在移动到bss段时,大小是整数倍?

我已经testing了这个angular色并且漂浮了,观察到了同样的行为。

Solutions Collecting From Web of "在bss和数据段中的整数variables大小"

看,答案是.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) } 

有用的链接: