more: Jollen 的 Embedded Linux 教育訓練

« 理解 dynamic loader 內部原理的幾個先備知識(上):ELF 端的議題 | Home | .bss section 的觀念:執行時期的長度 »

.bss section 的觀念:uninitialized data section

jollen 發表於 December 15, 2006 1:11 AM

.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

引用通告

如果您想引用這篇文章到您的Blog,
請複製下面的鏈接,並放置到您發表文章的相應界面中。

http://blog.jollen.org/mt-tb.cgi/284

發表一個評論

(您發表的意見將被立即接受,但需要一點時間與後端伺服器做同步,您的留言才會顯示在網站上。為避免 spam 攻撃,按「發表」後請輸入帳號密碼。使用者帳號:「nospam」、密碼:「nospam」。)

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org