2013-11-25 31 views
3

因此,在32位环境中,我编译了一个“.c”文件。比较目标文件以查找变量更改

 A.c and get A.o 

我省了A.o。

假设交流转换器有一个像

 int a // i change this to long a; 

变量i编译更改后,并得到另一A.O。

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

我得到汇编代码,并做差异,但我不能让它的头部和尾部。有人可以建议一个更聪明的方法。

+1

更聪明的办法是差异比较的来源,而不是目标文件:-)严重的是,如果你不太了解汇编语言,比较目标文件将会非常困难。源代码中的一些细微更改可能会在目标代码中产生剧烈变化。其他更改可能根本不会更改目标代码。相同的代码可以生成不同的目标文件,但环境变化很小。 – Mat

+0

'.o'文件会很乱。它们已经被翻译成目标微控制器的机器码。 –

+0

为什么你这样做? –

回答

4

我试着回答这个问题。目标文件可以直接与二进制十六进制编辑器进行比较。以这种方式获得的东西不可读,因为目标文件大部分是机器代码(当链接器尚未链接时,它也有链接器的符号)。我发现这种方法仅用于检查一些小东西(如代码版本和固件版本日期)。我认为对重大变化的理解只能通过反汇编目标文件来实现。幸运的是,有些工具可以完成这项工作,例如用于linux和unix的objdump,汇编程序有时并不直接,但至少它是人类可读的。假设您使用的是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

列表项