这可能是一个较旧的查询,但到目前为止我找不到任何令人满意的答案。 为了检查文件的内存映射,我写了一个小的hello程序。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Hello\n");
return 0;
}
现在编译之后,当我在其目标文件上使用命令size
时,我得到:
# size hello
text data bss dec hex filename
1133 492 16 1641 669 hello
我也检查了其他文件的大小。我总是得到bss 16。bss是固定的吗?这是包含在数据中还是不在数据中。我的意思是这个16是否包含在492中。据我了解,bss是未初始化的数据段。
答案 0 :(得分:4)
Nice article描述了什么是.bss。这是包含静态分配变量的段。因此,它的大小包含在目标文件大小中而不是固定的。
答案 1 :(得分:4)
BSS部分的大小因程序而异。它描述了使用'all bytes zero'初始化的数据量。零实际上并不存储在目标文件中,而是存储了BSS部分的大小。
数据部分包含未初始化为“所有字节为零”的所有数据结构的初始值;它在程序之间也各不相同。它不包括BSS部分中包含的空间。
你会得到一个更大的BSS部分,其程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum { A_SIZE = 100 };
static int a[A_SIZE];
int main(void)
{
srand(time(0));
for (int i = 0; i < A_SIZE; i++)
a[i] = i;
for (int i = A_SIZE; i > 0; i--)
{
int j = rand() % i; // Not good random number generation!
int t = a[j];
a[j] = a[i-1];
a[i-1] = t;
}
for (int i = 0; i < A_SIZE; i++)
printf("%d\n", a[i]);
return 0;
}
代码将数字从0改为99,在随机数生成中有一些偏差(因此它不是一个完美的随机播放,但这实际上不是练习的重点 - 它只是非平凡的代码使用静态数组,即使局部变量就足够了)。当我运行size
(在Ubuntu 13.10上)时,我得到:
text data bss dec hex filename
1593 584 432 2609 a31 shuffle
为了比较,在问题中的'hello'程序中,我得到:
text data bss dec hex filename
1200 560 8 1768 6e8 hello
主要区别在于数组a
占用400个字节;另外24个字节的BSS属于其他代码。
答案 2 :(得分:3)
您的查询相关.bss
已经回答;但是如果您正在查看根据查询语句似乎有用的内存映射,我建议使用readelf
,objdump
和&amp; nm
代替size
进行更详细的诊断。您也可以探索gcc
的映射文件,它可以通过链接器选项-Wl,-M
生成到控制台(stdout)或使用-Wl,-Map,<map_file_name>
生成符号映射ld
&amp;全球存储
P.S:与SO .bss
答案 3 :(得分:2)
char bss[100];
基本上,每个未初始化的静态变量都会进入BSS。