【问题标题】:why .bss explicitly initialize global variable to zero?为什么.bss 将全局变量显式初始化为零?
【发布时间】:2012-07-11 03:08:57
【问题描述】:

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

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

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

【问题讨论】:

  • 也许您的操作系统在加载内存时正在将 bss 部分初始化为零。你确定二进制图像中有零吗?
  • 有一次,bss 通常会被分配为未初始化的内存,但作为一种安全措施,大多数操作系统现在将其初始化为零,因此您甚至不能希望运行一个可能处理敏感数据,然后运行另一个只分配一大块未初始化存储的设备,以期找到仍在内存中的敏感数据。
  • 谢谢,没想到答案会这么快!标记赎金:我不执行可执行文件,我只是用 objdump 反汇编它......所以从内存加载它时不可能是不是?杰瑞棺材:我明白了……所以我们无能为力吗?但是,如果我只使用一个未初始化的指针,我可以在任何我想要的地方阅读不是吗?
  • 你可以使用-S 选项来代替objdump gcc。这会直接生成汇编程序,其优点是它可能更具可读性,因为您丢失的信息更少。
  • 我使用 objdump 是为了不必自己链接文件...有人告诉我这样做更容易

标签: c gcc assembly mips


【解决方案1】:

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

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

如果你想用某些数据初始化数据,那么在你的代码中给它一个初始化器。然后编译器会将其放入 .data 段(已初始化的数据)而不是 .bss(未初始化的数据)。当操作系统然后加载可执行文件时,它将为数据分配内存,然后从可执行文件中复制它。这需要额外的 I/O,但您的数据会以您想要的方式显式初始化。

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

【讨论】:

  • 即使数据重新生成速度很快,在运行时生成常量表也是个坏主意。如果常量表存储在程序二进制文件中,它是只读的并且由磁盘上的文件支持,因此它不会消耗提交费用,并且在内存压力下,它可以被丢弃(无成本)然后重新加载(低成本)而不是在被丢弃之前必须写出交换(高成本)。
  • 感谢您的回答,但我认为您误解了我的问题...我在互联网上发现了几篇帖子,这些帖子说的是您所说的,但我的问题是,事实上,.bss 部分中的数据实际上存储在可执行文件中(或至少是反汇编文件)
【解决方案2】:

我怀疑使用-z 选项会导致objdump 向您显示.bss 的零,即使零实际上不在您的二进制文件中。尝试使用od -t x4 获取二进制文件中真正内容的简单十六进制转储。如果od 向您显示零块,那么它们确实在二进制文件中。

【讨论】:

  • 我已经按照你说的做了,但我不太了解输出...它的数据似乎与 objdump 不同。它有时会在前后都有零的地方放一些 * ......所以我不确定它是否显示所有数据。但是我不使用交叉编译器中的工具这一事实可能会产生影响......无论如何,谢谢你的帮助,但事实上我已经找到了解决我的问题的方法:我把我的数组单独放在一个我创建的部分,我不拆开这个部分......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2011-01-06
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多