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

iSe*_*ult 5 c linux

这可能是一个较旧的查询,但到目前为止我找不到任何令人满意的答案。为了检查文件的内存映射,我编写了一个小 hello 程序。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        printf("Hello\n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在编译后,当我size在其目标文件上使用命令时,我得到:

# size hello
   text    data     bss     dec     hex filename
   1133     492      16    1641     669 hello
Run Code Online (Sandbox Code Playgroud)

我也检查了其他文件的大小。我总是得到 bss 为 16。bss 是固定的吗?这是包含在数据中还是不包含在数据中。我的意思是这 16 是否包含在 492 中。据我了解,bss是未初始化的数据段。

Jon*_*ler 5

BSS 部分的大小因程序而异。它描述了用“所有字节为零”初始化的数据量。这些零实际上并不存储在目标文件中,而是存储了 BSS 部分的大小。

\n\n

数据部分包含所有未初始化为“所有字节为零”的数据结构的初始值;不同程序之间的差异也有所不同。它不包括BSS部分中包含的空间。

\n\n
\n\n

你会得到一个更大的 BSS 部分,如下所示的程序:

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n\nenum { A_SIZE = 100 };\nstatic int a[A_SIZE];\n\nint main(void)\n{\n    srand(time(0));\n    for (int i = 0; i < A_SIZE; i++)\n        a[i] = i;\n    for (int i = A_SIZE; i > 0; i--)\n    {\n        int j = rand() % i;  // Not good random number generation!\n        int t = a[j];\n        a[j] = a[i-1];\n        a[i-1] = t;\n    }\n    for (int i = 0; i < A_SIZE; i++)\n        printf("%d\\n", a[i]);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该代码将数字从 0 洗牌到 99,随机数生成中存在一些偏差(因此它不是完美的洗牌,但这实际上不是练习的重点 \xe2\x80\x94 它只是非- 使用静态数组的简单代码,即使局部变量就足够了)。当我运行size(在 Ubuntu 13.10 上)时,我得到:

\n\n
text       data     bss     dec     hex filename\n1593        584     432    2609     a31 shuffle\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了进行比较,在问题中的“hello”程序上,我得到:

\n\n
text       data     bss     dec     hex filename\n1200        560       8    1768     6e8 hello\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要区别在于数组a占用400字节;BSS的另外24个字节属于其他代码。

\n