比较目标文件以查找变量更改

标签 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”文件找出到底发生了什么变化。

我正在获取汇编代码并进行比较,但我无法弄清它的正反面。有人可以建议更聪明的方法吗。

最佳答案

我试着回答这个问题。目标文件可以直接与二进制十六进制编辑器进行比较。您以这种方式获得的内容不是人类可读的,因为目标文件主要是机器代码(当它尚未链接时,它也有链接器的符号)。我发现这种方法只对检查一些小事情有用(比如代码版本和固件的构建日期)。我认为只有反汇编目标文件才能实现对显着变化的理解。幸运的是,有一些工具可以完成这项工作,例如用于 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

列表项

关于比较目标文件以查找变量更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202454/

相关文章:

c - C 编程语言是否有提供词汇表等数据结构的标准库

无法从 C 中的文本文件中提取值

c - GCC 编译器移植到新架构 : Call external library function

cross-browser - IE9 devicePixelRatio 等效项

Android/Linux ioctl FIONREAD 失败

你能解释一下这个例子中的频率数组逻辑吗?

c - 使用没有互斥锁的线程增加全局变量会奇怪地返回正确的值

windows - 我在哪里可以获得与 Windows Server 兼容的 32 位版本的 IESHIMS.dll 和 GPSVC.dll?

.net - CPU架构独立的P/Invoke : Can the DllName or path be "dynamic"?

deployment - 如何使用 32 位和 64 位的 jnlp 正确部署桌面 JavaFx 2.0 应用程序?