.bss
不佔據程式可執行程式大小,只在段表中記錄大小,在符號表中記錄符號。當檔案載入執行時,才分配空間以及初始化。
bss段的大小,記錄在段表裡裡,記錄的是所有未初始化變數總共的大小,bss段只在段表裡有個記錄,但實現並不存在這個段.
static int g;
static short int h;
int main(){}
用readelf -s 或 objdump -h 檢視段表:
每個未初始化的變數的大小放在了符號表裡。
你看下面符號表中的4 ,2分別就是g,h的大小。
用readelf -s 或 objdump -t 檢視符號表:
程式bss段的新理解
1 未初始化或初始化為0的 全域性變數和static變數 存於bss段。之前的錯誤認識 只區別初始化和未初始化,把初始為0歸為初始化。2 最後轉換成的二進位制檔案,bss段只包含起始位址和結束位址 或大小 3 常量的儲存在這裡被歸為 段了。其中常量 唯讀變數存於rodata 初始化 不是0 的全域性...
關於bss段的一些思考
bss段是用來存放 未初始化的全域性變數 未初始化的靜態區域性變數 初始化為0的全域性變數 部分編譯器會將它放到data段 初始化為0的靜態區域性變數 部分編譯器會將它放到data段 bss段在elf格式的可執行檔案中是不占用空間的,只會記錄它的大小等一些標記性資料,具體細節不討論。作業系統下的應用...
C 和C關於BSS段的區別
當編譯器遇到如下定義 point global 觀念上point的 trivial construction 和 destruction 都會被產生和呼叫,事實上,這些 trival members 要麼沒被產生,要麼沒被呼叫。在c中,global被視為乙個 臨時性的定義 因為他沒有顯示化的初始化操...