Tôi đã viết một chương trình Hello World đơn giản.Nghi ngờ trong tệp đối tượng thực thi và có thể định vị lại
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
Tôi muốn hiểu cách tệp đối tượng có thể định vị lại và tệp thực thi trông như thế nào. Đối tượng tập tin tương ứng với chức năng chính là
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
Ở đây, gọi hàm cho printf là callq 13. Một điều tôi không hiểu là tại sao nó 13. Điều đó có nghĩa gọi hàm ở adresss 13, phải không ??. 13 có hướng dẫn tiếp theo, phải không ?? Xin giải thích cho tôi điều này có nghĩa là gì ??
Các mã thực thi tương ứng với chính là
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 <[email protected]>
4004df: b8 00 00 00 00 mov $0x0,%eax
4004e4: c9 leaveq
4004e5: c3 retq
Dưới đây là callq 4003c0. Nhưng lệnh nhị phân là e8 e1 fe ff ff. Không có gì tương ứng với 4003c0. Điều gì là tôi đang nhận được sai?
Cảm ơn. Bala
Bất kỳ nhận xét nào từ trình gỡ xuống? –