所以在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”文件来找出究竟发生了什么变化。
我正在获取汇编代码并进行差异,但我无法对其进行改进。有人可以建议一个更聪明的方式。
答案 0 :(得分:4)
我试着回答这个问题。可以使用二进制十六进制编辑器直接比较目标文件。以这种方式获得的内容不是人类可读的,因为目标文件主要是机器代码(当链接器尚未链接时它也有符号)。我发现这种方法只对检查一些东西很有用(比如固件的代码版本和构建日期)。我认为只有通过反汇编目标文件才能理解重大变化。幸运的是,有一些工具可以完成这项工作,例如objdump
用于linux和unix,汇编程序有时并不简单,但至少它是人类可读的。假设您使用的是linux机器,则可以运行以下命令:
objdump -d yourobjectfile1 > out1
objdump -d yourobjectfile2 > out2
并比较结果。您会发现c代码中的一点变化会导致汇编代码的重新调整,因此对于实验我建议您使用helloworld.c级别的某些内容。
其他建议
gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s
列出项目