【发布时间】:2019-05-14 02:02:10
【问题描述】:
我知道callq 指令的作用;它在this answer 中有描述。指令应该有一个参数,应该是被调用函数的地址。
然而,当反汇编一个目标文件时,我看到下面一行显示了一条callq 指令,其中包含两个值而不是一个参数:
1e: e8 00 00 00 00 callq 23 <main+0x19>
我假设23 是返回地址,<main+0x19> 是要调用的函数的地址。但是,被调用的函数不在地址main+0x19。
callq指令反汇编显示的23和main+0x19这两个值是什么意思?
原始C代码:
#include <stdio.h>
void fun(int a)
{
}
int main()
{
int a = 1234;
fun(a);
}
objdump -D main.o main.asm 反汇编代码:
0000000000000000 <fun>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 90 nop
8: 5d pop %rbp
9: c3 retq
000000000000000a <main>:
a: 55 push %rbp
b: 48 89 e5 mov %rsp,%rbp
e: 48 83 ec 10 sub $0x10,%rsp
12: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%rbp)
19: 8b 45 fc mov -0x4(%rbp),%eax
1c: 89 c7 mov %eax,%edi
1e: e8 00 00 00 00 callq 23 <main+0x19>
23: b8 00 00 00 00 mov $0x0,%eax
28: c9 leaveq
29: c3 retq
【问题讨论】:
-
我不认为这是重复的,因为我认为这些答案中没有解决问题中的误解。
-
我投票支持重新开放,因为所谓的“重复”问题既没有询问指令的参数,也没有一个答案回答它。
-
我还以某种方式修改了这个问题 -我- 理解它。 @Edward:我希望我正确理解了你的问题,问题仍然是问你想问什么。
-
@MartinRosenau:同意。这不是关于
callq与call,而是首先要了解x86call rel32的工作原理以及反汇编程序如何帮助从相对偏移量计算绝对目标。以及未链接的目标文件如何工作。 -
@PeterCordes 我认为用户在理解
23和main+0x19这两个值时存在问题。所以我相应地修改了这个问题。用户无法理解地址 0x1F 处有一些重定位。 ...以及理解objdump -D不显示重定位的问题。
标签: linux assembly x86-64 disassembly object-files