【发布时间】:2012-07-11 03:08:57
【问题描述】:
我正在生成 mips 反汇编以模拟它。我需要有大数据来处理它,但我不想有大的汇编文件,所以我想处理一个未初始化的大数组(然后可能在我的模拟器中初始化它......)。所以我需要这个数组是全局的。并且全局变量似乎放在 .bss 部分,以便在实际访问页面时进行初始化。 问题出在我的二进制文件中,数组位于 .bss 部分,但显式填充为零......如果我正确理解我在互联网上找到的内容,这不是预期的行为......有没有办法说编译器(或链接器,或加载器......我不太明白哪一个为此做了什么)没有真正在这个数组中放零? 或者,我们可以在编译时有一个选项,或者一个 C 指令说我们不希望这个数组被初始化为 0 吗? (我尝试用 attribute 更改数组部分,但它仍然用 0 初始化。
顺便说一句,我正在使用 objdump 生成我的反汇编文件,它通常会跳过零块,但我确实需要反汇编其他零块,所以我使用“-z”选项。
我真正不明白的是,在我所见的任何地方,都说 .bss 部分并没有真正将零放在二进制文件中......
【问题讨论】:
-
也许您的操作系统在加载内存时正在将 bss 部分初始化为零。你确定二进制图像中有零吗?
-
有一次,bss 通常会被分配为未初始化的内存,但作为一种安全措施,大多数操作系统现在将其初始化为零,因此您甚至不能希望运行一个可能处理敏感数据,然后运行另一个只分配一大块未初始化存储的设备,以期找到仍在内存中的敏感数据。
-
谢谢,没想到答案会这么快!标记赎金:我不执行可执行文件,我只是用 objdump 反汇编它......所以从内存加载它时不可能是不是?杰瑞棺材:我明白了……所以我们无能为力吗?但是,如果我只使用一个未初始化的指针,我可以在任何我想要的地方阅读不是吗?
-
你可以使用
-S选项来代替objdumpgcc。这会直接生成汇编程序,其优点是它可能更具可读性,因为您丢失的信息更少。 -
我使用 objdump 是为了不必自己链接文件...有人告诉我这样做更容易