2016-11-18 66 views
6

我写下面的简单的C程序(test.c的): -歧义行为

#include<stdio.h> 
int main() 
{ 
    return 0; 
} 

和执行的follwing了解的.bss段大小的变化。

gcc test.c -o test 
size test 

输出来如: -

text data  bss  dec  hex filename 
    1115  552  8 1675  68b test 

我没有全局或静态范围声明任何东西。所以请解释为什么bss段大小是8个字节。

我提出了以下变化: -

#include<stdio.h> 
int x; //declared global variable 
int main() 
{ 
    return 0; 
} 

但令我惊讶的,产量为同以前: -

text data  bss  dec  hex filename 
    1115  552  8 1675  68b test 

请解释。 我然后初始化全局: -

#include<stdio.h> 
int x=67; //initialized global variable 
int main() 
{ 
    return 0; 
} 

数据段的大小随着预期,但没想到BSS段的大小减少到4(相反,以8被宣布没事的时候)。请解释。

text  data  bss  dec  hex filename 
1115  556  4 1675  68b test 

我也尝试了objdump和nm的命令,但他们也显示变量x占用.bss(在第二种情况下)。但是,尺寸命令中不显示bss尺寸的更改。

我按照以下程序按照: http://codingfox.com/10-7-memory-segments-code-data-bss/ 其中输出如预期般完美。

回答

5

当您编译一个简单的main程序时,您也会链接启动代码。 此代码负责,除其他外,初始化bss。

该代码是在“.bss”部分中“使用”8个字节的代码。

您可以使用剥离GCC -nostartfiles选项代码:

-nostartfiles

链接时不要使用标准系统启动文件。标准系统库通常使用的,除非-nostdlib或-nodefaultlibs用于

要使测试使用以下代码

#include<stdio.h> 

int _start() 
{ 
    return 0; 
} 

并用

gcc -nostartfiles test.c 

刹那间编译它看。BSS设置为0

text data  bss  dec  hex filename 
    206  224  0  430  1ae test 
1

,因为你没有使用可变x你的前两个片段是相同的。

试试这个

#include<stdio.h> 
volatile int x; 
int main() 
{ 
    x = 1; 
    return 0; 
} 

,你应该看到在.bss大小的变化。

请注意,那些4/8字节是启动代码内的东西。它是什么以及它为什么变化的大小是不可能分辨出所有启动代码的细节。