繁体   English   中英

零初始化的结构不会出现在内存中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM