我试过了
objdump -d myfile.o > myfile.lis
生成的输出在有链接时间或加载时间的地方都为零" fixup"在编译的代码中。例如,输出的一行是:
1ab5: 0f 57 2d 00 00 00 00 xorps 0x0(%rip),%xmm5
0x0(%rip)实际上是对同一个.o文件中某个常量的引用,但是反汇编没有给出任何提示。 另一行是
1934: e8 00 00 00 00 callq 1939 <garbage>
这更令人沮丧。它实际上是对另一个模块中的命名函数的调用。该函数不是当前模块的偏移量1939(如反汇编所示),并且不是objdump产生的偏移量1939的巨大垃圾表示,我在复制时用“垃圾”一词替换。
是否有其他工具或其他使用objdump的方法,它将使用同一.o文件的其他部分的信息来为.o文件中的这些行提供正确的反汇编?或者我以某种方式安装了错误版本的objdump(相对于生成.o文件的编译器)和正确版本的objdump会起作用吗?
编辑以响应stakx的评论,我用一个包含
的简单文件重新编写测试void tiny() { fun(0); }
并使用
编译gcc -c tiny.c
然后
objdump -d tiny.o
产生
0000000000000000 <tiny>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: b8 00 00 00 00 mov $0x0,%eax
e: e8 00 00 00 00 callq 13 <tiny+0x13>
13: c9 leaveq
14: c3 retq
这与更复杂的例子中看到的问题完全相同(在解析对foo的调用时忽略了修正)。