gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:49:11 24 4
gpt4 key购买 nike

我知道在我的文件中使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com