目标文件中的函数和参数不正确?

时间:2014-10-05 13:47:35

标签: c gcc assembly

#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文件,其中所有值都是正确的。那么链接器怎么能知道在哪里找到那些函数或字符串呢?

1 个答案:

答案 0 :(得分:0)

您只是在翻译文件,因此没有进行任何链接。一旦链接jas完成,然后DispString()的地址将为main所知,它将跳转到那里。因此,正如其中一条评论中所建议的那样,将objdump与comliled可执行文件一起使用。