函数调用似乎在反汇编代码中无法正常工作

时间:2014-04-15 00:10:02

标签: c++

我写了一个简单的程序然后编译并组装它。

tfc.cpp

int i = 0;

void f(int a)
{
  i += a;
};

int main()
{
  f(9);
  return 0;
};

我通过运行

得到了tfc.o.
$ g++ -c -O1 tfc.cpp

然后我使用 gobjdump objdump )来反汇编二进制文件。

$ gobjdump -d tfc.o

然后我得到了

0000000000000000 <__Z1fi>:
   0: 55                    push   %rbp
   1: 48 89 e5              mov    %rsp,%rbp
   4: 01 3d 00 00 00 00     add    %edi,0x0(%rip)        # a <__Z1fi+0xa>
   a: 5d                    pop    %rbp
   b: c3                    retq   
   c: 0f 1f 40 00           nopl   0x0(%rax)

0000000000000010 <_main>:
  10: 55                    push   %rbp
  11: 48 89 e5              mov    %rsp,%rbp
  14: bf 09 00 00 00        mov    $0x9,%edi
  19: e8 00 00 00 00        callq  1e <_main+0xe>
  1e: 31 c0                 xor    %eax,%eax
  20: 5d                    pop    %rbp
  21: c3                    retq  

奇怪的是,callq指令后跟1e <_main+0xe>。它不应该是<__Z1fi>的地址吗?如果没有,main函数如何调用f函数?

修改 供参考:

$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

1 个答案:

答案 0 :(得分:1)

它调用地址0,这是f函数的地址。

e8是x86中的调用指令,根据:

http://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf

调用使用相对于下一条指令的位移,在内存位置1e。这就变成了内存位置0.所以它实际上是callq 1e,它的调用地址为0。