【发布时间】:2014-07-18 20:37:21
【问题描述】:
我正在尝试学习 C 程序的可执行文件的结构。我的环境是 GCC 和 64 位 Intel 处理器。
考虑以下 C 代码a.cc。
#include <cstdlib>
#include <cstdio>
int x;
int main(){
printf("%d\n", sizeof(x));
return 10;
}
size -o a 节目
text data bss dec hex filename
1134 552 8 1694 69e a
在我添加另一个初始化的全局变量 y 之后。
int y=10;
size a 显示(其中a 是来自 a.cc 的可执行文件的名称)
text data bss dec hex filename
1134 556 12 1702 6a6 a
众所周知,BSS 部分存储未初始化的全局变量的大小,DATA 存储已初始化的变量。
- 为什么
int在BSS中占用8个字节?我代码中的sizeof(x)表明int实际上占用了4 个字节。 int y=10为 DATA 添加了 4 个字节,这是有道理的,因为int应该占用 4 个字节。但是,为什么要给 BSS 增加 4 个字节呢?
删除#include ... 这两行后,两个size 命令之间的差异保持不变。
更新:
我认为我对 BSS 的理解是错误的。它可能不存储未初始化的全局变量。正如维基百科所说,“BSS 在运行时需要的大小记录在目标文件中,但 BSS(与数据段不同)不占用目标文件中的任何实际空间。”例如,即使是一行 C 代码int main(){} 也有bss 8。
BSS的8位还是16位来自alignment?
【问题讨论】:
-
你看过汇编代码吗?它可以在 bss 中声明并稍后使用
-
@JoachimPileborg 我在 Wikipedia 中看到了这一点,这让我对 BSS 部分感到困惑。谢谢。
-
没有全局变量时
bss为0? -
你说的是C还是C++?您始终提到 C,但您的示例程序是 C++。如果你删除变量
x,你会得到什么 BSS 大小? -
此代码不是有效的 C,
size -o不可能打印 8,因为-o表示“八进制”。投票结束,因为不可复制。