【发布时间】:2016-03-05 09:25:41
【问题描述】:
第一种情况:
#include <stdio.h>
int main(void)
{
return 0;
}
尺寸输出:
text data bss dec hex filename
1115 552 8 1675 68b ./a.out
第二种情况:
#include <stdio.h>
int global; // new line compared to previous case
int main(void)
{
return 0;
}
大小输出:
text data bss dec hex filename
1115 552 8 1675 68b ./a.out
理想情况下应该是:
bss=12 and all other (text and data) same
第三种情况:
#include <stdio.h>
int global;
int main(void)
{
static int i; // new line compared to previous case
return 0;
}
大小输出:
text data bss dec hex filename
1115 552 16 1683 693 ./a.out
这是正确的
为什么第二种情况的输出不正确?
【问题讨论】:
-
你的优化标志是什么?
-
它就像被编译器忽略了,因为它根本没有被使用。
-
第三种情况,你保留
global变量了吗? -
要明确说明,您需要查看文件中包含的 ELF 信息。我个人认为这与优化的变量无关。 bss 部分通常位于动态部分之前。动态部分需要 8 字节对齐。因此需要填充 bss 部分以确保动态部分从正确对齐开始。在第一种情况下,没有用户 bss 变量。但总是至少有一个 bss 符号
__bss_start。所以 bss 的大小是 8。当添加一个 4 字节的 bss 变量时,它适合填充空间,因此整体 bss 大小不会改变。 -
很可能它仅以 8 字节为单位分配 bss,而 stdio.h 或其他东西分配了 4 字节。您可以通过生成一个地图文件来确认这一点,该文件将列出这些段中所有内容的名称
标签: c linux data-segment