.bss 節區存放「uninitialized data」,由程式碼的角度來看,就是「未初始化的變數」。我們直接以一段 code 來說明,讓大家更清楚這樣的概念。
#include <stdio.h>
int foo; int bar;
int main(void) { int *ptr;
printf(".bss section starts at %08p\n", &foo);
printf("foo is %d.\n", foo);
ptr = &foo; *ptr = 12345;
printf("foo is %d.\n", foo); printf(".bss section starts at %08p\n", &foo);
return 0; }
這段 code 相當簡單,但是隱含幾個重要的觀念,條列說明如下:
1. foo 是一個變數,在程式碼裡沒有被初始化(uninitialized),所以程式執行時(process),foo 變數會被擺在「.bss section」。
2. 同理,bar 變數也是。
3. foo 是第一個 uninitialized data,所以他的 virtual address,形同 .bss section 的開始位址(process virtual address)。
程式要實驗的項目如下:
1. 觀念 3. 的應用,我們印出 .bss section 的 start address。
2. foo 是全域變數,未初始化時的值是 0(zero)。
3. 用 '*ptr' 指向 .bss section 的 start address,此位址等於 foo 變數的值。
4. 把 .bss section 啟始位址處記憶體的值(value)改成 12345(透過 ptr 指標)。
沒搞錯的話,foo 變數的值就會變成 12345。
以下是執行結果:
# ./bss .bss section starts at 0x8049588 foo is 0. foo is 12345. .bss section starts at 0x8049588
很特別的一個 section,值得深入研究。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw