1、未初始化或初始化為0的 全域性變數和static變數 存於bss段。
之前的錯誤認識:只區別初始化和未初始化,把初始為0歸為初始化。
2、最後轉換成的二進位制檔案,bss段只包含起始位址和結束位址(或大小)。
3、常量的儲存在這裡被歸為**段了。
其中常量、唯讀變數存於rodata;初始化(不是0)的全域性變數、靜態變數存於data;
測試程式
arm-linux-size file.elf
du file.bin -b
void start(void)
text data bss dec hex
32 0 0 32 20
32int
a;void start(void)
text data bss dec hex
32 0 4 36 24
32int a = 0;
void start(void)
text data bss dec hex
32 0 4 36 24
32int a = 10;
void start(void)
text data bss dec hex
32 4 0 36 24
36int a = 10;
void start(void)
text data bss dec hex
48 4 0 52 34
52int a = 10;
int b = 0;
int c[1000] = ;
void start(void)
text data bss dec hex
48 4 4004 4056 fd852
關於bss段的理解
bss不佔據程式可執行程式大小,只在段表中記錄大小,在符號表中記錄符號。當檔案載入執行時,才分配空間以及初始化。bss段的大小,記錄在段表裡裡,記錄的是所有未初始化變數總共的大小,bss段只在段表裡有個記錄,但實現並不存在這個段.static int g static short int h int...
bss段不佔據磁碟空間的理解
elf檔案中.bss段 存放未初始化的全域性變數,將.data和.bss分開的理由是為了節約磁碟空間,bss不佔實際的磁碟空間。這句話該怎麼理解呢?可以看下面的例子 include int a 1000 int b 1000 int main 這裡編寫了乙個test.c的檔案,gcc編譯gcc te...
bss段和 data段的區別
在採用段式記憶體管理的架構中 比如intel的80x86系統 bss段 block started by symbol segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。比如,在c語...