disassembly.o文件与修复程序

disassembly.o文件与修复程序,assembly,objdump,Assembly,Objdump,我试过了 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 <garba

我试过了

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>
并用

gcc -c tiny.c
然后

产生

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   
0000000000000000:
0:55推送%rbp
1:48 89 e5 mov%rsp,%rbp
4:bf 00 mov$0x0,%edi
9:b8 00 mov$0x0,%eax
e:E800呼叫13
13:c9-Q
14:c3 retq

这与在更复杂的示例中看到的问题完全相同(在分解对foo的调用时忽略了修复)。

我发现完全判断/理解这个问题有点困难,因为对您的设置知之甚少。您是否可以发布一个(最低限度完整的)代码示例(
myfile.as
?),以及如何调用汇编程序(GNU
as
?)以及您正在处理的CPU体系结构的提示?我尤其不理解这种“垃圾”。原始源代码中的
callq
指令之后会出现什么?垃圾是什么样子的,作为
objdump
的输出?这肯定是可能的;所有的信息都在那里。据我所知,GNU<代码> ObjDopp可以在其他架构上显示固定信息,如ARM。我用英特尔C++编译器编译C++代码。该函数是一个复杂的模板实例化,当objdump试图请求错误地址的符号形式时,会导致“垃圾”。“垃圾”不是我问题的焦点。地址错了。我并没有怀疑模板和编译器是objdump未能包含任何来自修复的贡献的一个因素。我认为objdump是错误的工具,或者我误用了它,所以有人会告诉我正确的命令。但也许我需要一个更简单的测试来看看objdump是否曾经使用fixup贡献进行过反汇编。问题发生在使用gcc编译的简单.c模块中。它不依赖于英特尔编译器、C++、模板或任何其他原始复杂性。我还分别测试了32位x86中是否出现相同的行为。所以我仍然有我最初的假设和问题:我使用的objdump命令不包括反汇编中的修复。是否有某种命令或工具可以执行此操作?
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