3

因此,在 32 位环境中,我编译了一个“.c”文件。

       A.c and get A.o

我救了敖。

假设 Ac 有一个变量,如

     int a // i change this to long a;

更改后我编译并获得另一个 Ao

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

我正在获取汇编代码并进行比较,但我无法对其进行正面和反面。有人可以建议一个更聪明的方法。

4

1 回答 1

4

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

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

然后比较结果。你会发现c代码的一点点改动都会导致汇编代码的大调整,所以作为一个实验我建议你使用helloworld.c级别的东西

其他建议

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

项目清单

于 2013-11-25T22:16:36.057 回答