2016-11-18 64 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字節是啓動代碼內的東西。它是什麼以及它爲什麼變化的大小是不可能分辨出所有啓動代碼的細節。