我正在使用测试程序来理解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段时为什么大小是整数加倍?
我已经测试了这个角色并浮动,观察到同样的行为。
答案 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)
}
有用的链接: