用户进程内存映射 - bss部分总是大小相同吗?

时间:2011-09-26 05:21:38

标签: c linux

这可能是一个较旧的查询,但到目前为止我找不到任何令人满意的答案。 为了检查文件的内存映射,我写了一个小的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是未初始化的数据段。

4 个答案:

答案 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已经回答;但是如果您正在查看根据查询语句似乎有用的内存映射,我建议使用readelfobjdump和&amp; nm代替size进行更详细的诊断。您也可以探索gcc映射文件,它可以通过链接器选项-Wl,-M生成到控制台(stdout)或使用-Wl,-Map,<map_file_name>生成符号映射ld&amp;全球存储 P.S:与SO .bss

上的{{1}}相关的一个非常好的答案

答案 3 :(得分:2)

如果您有一个未初始化的数组,那么BSS会更大: 例如。 char bss[100];

基本上,每个未初始化的静态变量都会进入BSS。