gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:22:49 30 4
gpt4 key购买 nike

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

首先我编译了下面的代码,

#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

然后,在删除静态变量“i”的初始化后,我的代码变成了,

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

关于上面编译后的running size,

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

bss段增加了8字节,数据段只减少了4字节。为什么在移动到 bss 段时大小是整数?

我也测试了这个字符和 float ,观察到相同的行为。

最佳答案

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

有用的链接:

关于c - bss 和数据段中的整数变量大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21130729/

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