[英]Zero-initialized struct not appear in memory
我正在學習匯編,令我驚訝的是,零初始化的結構沒有占用內存。 我的代碼就是這樣。
// in file a.cpp
#include <stdint.h>
struct Bar {
char filename[8];
// ignore members here
uint32_t filesize;
}__attribute__((packed));
typedef struct FAT_ITEM FAT_ITEM;
Bar bar1 = {
"null",0
};
Bar bar2 = {
"",0
};
然后我編譯代碼
gcc -march=i386 -m16 -mpreferred-stack-boundary=2 -ffreestanding -O0 a.cpp a.o
ld -melf_i386 -N --oformat binary -o a.bin a.o
但是,當我使用dd
讀取a.bin中的二進制文件時,我看到
00000000: 6e75 6c6c 0000 0000 0000 0000 null........
(END)
bar2
沒有出現在內存中。 32位零來自bar1.filesize
。 然后是(END)
。
我正在學習16位x86匯編程序,因此編譯選項可能很奇怪。 但我認為它們不會導致此問題。
誰能幫我解釋為什么bar2
被“忽略”?
將零初始化內容放入BSS的編譯器, 默認鏈接程序腳本不會在BSS 中為其分配空間 ; 它在其他部分結束之后開始。
在您的C代碼運行之前,您可以在啟動時-fno-zero-initialized-in-bss
,或者禁用編譯器對BSS的使用(例如-fno-zero-initialized-in-bss
。
您可以看一下gcc -S
輸出; 請注意.lcomm
或.comm
指令為所有零初始化靜態/全局變量保留BSS空間。 在編譯普通的Linux可執行文件時,您不希望在可執行文件中顯式存儲大量的零。
參見https://gcc.gnu.org/ml/gcc-help/2007-07/msg00097.html進行一些討論,例如,您可以使用__attribute__
將實際上需要零初始化的數組放入不同的部分,如果您不想編寫在啟動時運行的零初始化循環。 然后,您可以在BSS中擁有一些根本不需要初始化的數組,但是可以在二進制文件中花費一些空間來在需要它的其他事物上使用顯式零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.