所以在 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”文件找出到底发生了什么变化。
我正在获取汇编代码并进行比较,但我无法弄清它的正反面。有人可以建议更聪明的方法吗。
最佳答案
我试着回答这个问题。目标文件可以直接与二进制十六进制编辑器进行比较。您以这种方式获得的内容不是人类可读的,因为目标文件主要是机器代码(当它尚未链接时,它也有链接器的符号)。我发现这种方法只对检查一些小事情有用(比如代码版本和固件的构建日期)。我认为只有反汇编目标文件才能实现对显着变化的理解。幸运的是,有一些工具可以完成这项工作,例如用于 linux 和 unix 的 objdump
,汇编程序有时并不简单,但至少它是人类可读的。假设您使用的是 linux 机器,您可以运行以下命令:
objdump -d yourobjectfile1 > out1
objdump -d yourobjectfile2 > out2
然后比较结果。你会发现 c 代码的一点点变化都会导致汇编代码的大调整,所以对于实验我建议你使用 helloworld.c 级别的东西
其他建议
- 使用 -O0 编译,它创建一个更简单的程序集(并且更类似于 你的 c) 因为优化被禁用。
- 尝试使用可执行文件或链接的共享库(仅机器代码)并在比较之前剥离您的对象,这样您将减小其大小。
- 您可以创建一个混合的 c 汇编程序代码,这样可以使阅读更容易:
gcc -g -c -fverbose-asm myfile.c; objdump -d -M intel -S ass.o > main.s
列表项
关于比较目标文件以查找变量更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202454/