#include <stdio.h>
void DispString(const char* charList)
{
puts(charList);
}
void main()
{
DispString("Hello, world!");
}
编译 :gcc -c -g test.c -o test.o
链接 :gcc -o test test.o
很简单,但是当我使用objdump来反汇编目标文件(test.o)时,我得到了以下结果:
objdump -d test.o:
boot.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <DispString>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
c: 48 8b 45 f8 mov -0x8(%rbp),%rax
10: 48 89 c7 mov %rax,%rdi
13: e8 00 00 00 00 callq 18 <DispString+0x18>
18: c9 leaveq
19: c3 retq
000000000000001a <main>:
1a: 55 push %rbp
1b: 48 89 e5 mov %rsp,%rbp
1e: bf 00 00 00 00 mov $0x0,%edi
23: e8 00 00 00 00 callq 28 <main+0xe>
28: 5d pop %rbp
29: c3 retq
对于第23行,它将0传递给%edi寄存器,这绝对是错误的。它应该传递&#34; Hello,world!&#34;串到它。它叫28 <main+0xe>
?第28行只是它的下一行,而不是函数DispString(在第0行)。为什么会这样?我还查看了最终的test
文件,其中所有值都是正确的。那么链接器怎么能知道在哪里找到那些函数或字符串呢?
答案 0 :(得分:0)
您只是在翻译文件,因此没有进行任何链接。一旦链接jas完成,然后DispString()的地址将为main所知,它将跳转到那里。因此,正如其中一条评论中所建议的那样,将objdump与comliled可执行文件一起使用。