assembly - 继续获取 e8 00 00 00 00 作为机器代码以在汇编中调用函数

标签 assembly linker x86 disassembly machine-code

我知道在我的文件中使用 objdump -drcall 在机器代码中显示为 e8 00 00 00 00 因为它没有尚未被链接。但我需要找出链接器完成工作后 00 00 00 00 会变成什么。我知道它应该计算偏移量,但我对此有点困惑。

以下面的代码为例,链接器部分完成后,e8 00 00 00 00应该如何?我如何得到这个答案?

我正在使用此示例代码进行测试:(我正在尝试调用 moo)

Disassembly of section .text:

0000000000000000 <foo>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   89 7d fc                mov    %edi,-0x4(%rbp)
   7:   8b 45 fc                mov    -0x4(%rbp),%eax
   a:   83 e8 0a                sub    $0xa,%eax
   d:   5d                      pop    %rbp
   e:   c3                      retq   

000000000000000f <moo>:
   f:   55                      push   %rbp
  10:   48 89 e5                mov    %rsp,%rbp
  13:   89 7d fc                mov    %edi,-0x4(%rbp)
  16:   b8 01 00 00 00          mov    $0x1,%eax
  1b:   5d                      pop    %rbp
  1c:   c3                      retq   

000000000000001d <main>:
  1d:   55                      push   %rbp
  1e:   48 89 e5                mov    %rsp,%rbp
  21:   48 83 ec 10             sub    $0x10,%rsp
  25:   c7 45 fc 8e 0c 00 00    movl   $0xc8e,-0x4(%rbp)
  2c:   8b 45 fc                mov    -0x4(%rbp),%eax
  2f:   89 c7                   mov    %eax,%edi
  31:   e8 00 00 00 00          callq  36 <main+0x19>
            32: R_X86_64_PC32   moo-0x4
  36:   89 45 fc                mov    %eax,-0x4(%rbp)
  39:   b8 00 00 00 00          mov    $0x0,%eax
  3e:   c9                      leaveq 
  3f:   c3                      retq

最佳答案

使用 objdump -r 您可以使用反汇编 -d 打印重定位:

  31:   e8 00 00 00 00          callq  36 <main+0x19>
            32: R_X86_64_PC32   moo-0x4

ld-linux.so.2 加载器将重定位对象(在现代世界中,它甚至会将可执行文件重定位到随机地址)并用正确的地址填充重定位。

通过在 main 处添加断点并启动程序来检查 gdb(链接器在 main 函数启动之前工作):

gdb ./program
(gdb) start
(gdb) disassemble main

如果您想在不重定位的情况下编译代码,请显示源代码和编译选项。

关于assembly - 继续获取 e8 00 00 00 00 作为机器代码以在汇编中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687852/

相关文章:

performance - 多核 Intel CPU 中的高速缓存是如何共享的?

java - Java字节码有 "indirect jump"吗?

c - 使用 CMake 编译为静态库时出现问题

assembly - PIC/汇编,在寄存器之间复制和循环 10 位

c++ - 让 GraphViz 作为 C++ 库工作的困难

c - 给数组赋值需要memcpy

assembly - 字节、字和双字之间的转换

assembly - 汇编语言中 "short"跳转是什么意思?

gcc - 是否可以找到 GCC 可以生成的所有汇编指令的列表?

plugins - 如何为 ollydbg 2.x.x 设置插件?