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

Nod*_*aju 2 x86 assembly linker machine-code disassembly

我知道objdump -dr在我的文件call中使用时会出现在机器代码中,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
Run Code Online (Sandbox Code Playgroud)

osg*_*sgx 6

有了objdump -r你的反汇编打印了 Relocations -d

  31:   e8 00 00 00 00          callq  36 <main+0x19>
            32: R_X86_64_PC32   moo-0x4
Run Code Online (Sandbox Code Playgroud)

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

请与gdb通过添加断点main和启动程序(前连接器的工作原理main功能启动):

gdb ./program
(gdb) start
(gdb) disassemble main
Run Code Online (Sandbox Code Playgroud)

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