【发布时间】:2010-05-06 22:12:38
【问题描述】:
我编写了一个简单的 Hello World 程序。
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
我想了解可重定位目标文件和可执行文件的外观。 main函数对应的object文件是
0000000000000000 <main>:
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 <main+0x13>
13: b8 00 00 00 00 mov $0x0,%eax
18: c9 leaveq
19: c3 retq
这里 printf 的函数调用是 callq 13。我不明白的一件事是为什么它是 13。这意味着调用地址为 13 的函数,对吗?? 13有下一条指令,对吧??请解释一下这是什么意思??
main对应的可执行代码是
00000000004004cc <main>:
4004cc: 55 push %rbp
4004cd: 48 89 e5 mov %rsp,%rbp
4004d0: bf dc 05 40 00 mov $0x4005dc,%edi
4004d5: b8 00 00 00 00 mov $0x0,%eax
4004da: e8 e1 fe ff ff callq 4003c0 <printf@plt>
4004df: b8 00 00 00 00 mov $0x0,%eax
4004e4: c9 leaveq
4004e5: c3 retq
这里是 callq 4003c0。但是二进制指令是e8 e1 fe ff ff。没有对应于 4003c0 的内容。我错了什么?
谢谢。 巴拉
【问题讨论】:
标签: c executable object-files