比较目标文件以查找变量

时间:2013-11-25 20:18:56

标签: c 32bit-64bit porting objdump readelf

所以在32位环境中我编译了一个“.c”文件。

       A.c and get A.o

我保存A.o。

假设A.c有一个像

这样的变量
     int a // i change this to long a;

更改后,我编译并获得另一个A.o。

现在当我做“cmp A.o A.o”时,我可以看到这些文件不同。现在我的问题可以通过比较“.o”文件来找出究竟发生了什么变化。

我正在获取汇编代码并进行差异,但我无法对其进行改进。有人可以建议一个更聪明的方式。

1 个答案:

答案 0 :(得分:4)

我试着回答这个问题。可以使用二进制十六进制编辑器直接比较目标文件。以这种方式获得的内容不是人类可读的,因为目标文件主要是机器代码(当链接器尚未链接时它也有符号)。我发现这种方法只对检查一些东西很有用(比如固件的代码版本和构建日期)。我认为只有通过反汇编目标文件才能理解重大变化。幸运的是,有一些工具可以完成这项工作,例如objdump用于linux和unix,汇编程序有时并不简单,但至少它是人类可读的。假设您使用的是linux机器,则可以运行以下命令:

objdump -d yourobjectfile1 > out1
objdump -d yourobjectfile2 > out2

并比较结果。您会发现c代码中的一点变化会导致汇编代码的重新调整,因此对于实验我建议您使用helloworld.c级别的某些内容。

其他建议

  1. 使用-O0进行编译,它可以创建更简单的程序集(更类似于 你的c)因为优化被禁用了。
  2. 尝试使用可执行文件或链接共享库(仅限机器代码)并在比较之前剥离对象,这样可以减小其大小。
  3. 您可以创建一个混合的c-assembler代码,以这种方式简化阅读:gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s
  4. 列出项目