3

C 文件中定义的变量的大小在编译后的代码的汇编等效项中出现在哪里?

想象一下你的第一个代码是:

char buffer[2];
char a[3];

你的下一个代码是:

char buffer[3];
char a[2];

其中“buffer”和“a”是函数的局部变量。

在这两种情况下,esp当你进入函数时,它都会减少相同的字节数,但是如果你没有访问源代码并且只是在反汇编二进制文件,有没有办法区分边界?

我想知道二进制文件中是否有一个段可以跟踪变量的大小。

4

3 回答 3

4

据我所知,在这种情况下判断的唯一方法是查看堆栈的使用方式。

一旦代码被编译为汇编,类型信息并没有真正保留,唯一可以推断的是正在使用的汇编指令的类型(无论它们是对位、字、双字等进行操作)

IDA Pro 有一个反汇编为 C 的功能,该功能通常是准确的,它在大多数情况下不会简化为工作 C,但在 ASM 的快速分析方面非常强大。它所做的一件事是找出数组的大小,但是很多时候它只会将它们键入为字节(或字符)数组,您可能必须分析代码以查看它是如何被准确使用的。

于 2013-02-21T13:23:00.203 回答
1

我想知道二进制文件中是否有一个段可以跟踪变量的大小。

不,没有。

最多您可以找到变量的相对偏移量,以及分配的总堆栈。

于 2013-02-21T13:23:55.563 回答
0

通常它被放在一个单独的文件中(或者更常见的是:无处),但诸如此类的调试信息可能保存在二进制文件中。显然,您不能依赖它,但是如果您可以控制二进制文件的生成,则可以安排信息在那里。

于 2013-02-21T13:29:38.790 回答