程式bss段的新理解

2021-06-14 15:14:23 字數 951 閱讀 8794

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語...