Я написал простую программу Hello World.
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
Я хотел понять, как выглядят перемещаемый объектный файл и исполняемый файл.
Объектный файл, соответствующий основной функции:
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. Что это, я ошибаюсь?
Спасибо.
Bala