0

我正在生成 mips 反汇编以模拟它。我需要有大数据来处理它,但我不想有大的程序集文件,所以我想处理一个未初始化的大数组(然后可能在我的模拟器中初始化它......)。所以我需要这个数组是全局的。并且全局变量似乎放在 .bss 部分,以便在实际访问页面时进行初始化。问题出在我的二进制文件中,数组位于 .bss 部分,但显式填充为零......如果我正确理解我在互联网上找到的内容,这不是预期的行为......有没有办法说编译器(或链接器,或加载器......我不太明白哪一个为此做了什么)没有真正在这个数组中放零?或者,我们可以在编译时有一个选项,或者一个 C 指令说我们不' 不希望这个数组被初始化为 0 吗?(我试图改变数组部分属性,但它仍然用 0 初始化)。

顺便说一句,我正在使用 objdump 生成我的反汇编文件,它通常会跳过零块,但我确实需要反汇编其他零块,所以我使用“-z”选项。

我真正不明白的是,在我所看的任何地方,都说 .bss 部分并没有真正在二进制文件中放零......

4

2 回答 2

9

.bss 部分的数据没有存储在编译的目标文件中,因为没有数据——编译器将变量放在该段中正是因为它们应该被零初始化。

当操作系统加载可执行文件时,它只会查看 .bss 段的大小,分配那么多内存,然后为您将其初始化为零。通过不将该数据存储在可执行文件中,它可以减少加载时间。

如果您希望使用某些数据初始化数据,请在代码中为其提供初始化程序。然后编译器会将其放入 .data 段(初始化数据)而不是 .bss(未初始化数据)。当操作系统然后加载可执行文件时,它将为数据分配内存,然后从可执行文件中复制它。这需要额外的 I/O,但您的数据会按照您的需要进行显式初始化。

或者,您可以将数据保留在 .bss 段中,然后在运行时自行初始化。如果数据在运行时快速且易于生成,则在启动时重新计算它可能会更快,而不是从磁盘中读取它。但这些情况可能很少见。

于 2012-07-11T03:20:20.087 回答
0

I suspect that using the -z option is causing objdump to show you zeroes for the .bss, even though the zeroes are not actually in your binary. Try using od -t x4 to get a simple hexadecimal dump of what is really in the binary. If od shows you blocks of zeroes, then they really are in the binary.

于 2012-07-12T17:54:40.330 回答