GCC编译并链接原始输出

时间:2015-05-26 21:54:16

标签: gcc assembly mips

我正在尝试使用函数调用获取简单C程序的原始指令代码输出。

我已经在这里和谷歌搜索了答案,但只能找到对单个函数正确的答案(没有函数调用)。

一个简单的例子:

int main(){
    return addition(5, 7);
}

int addition(int a, int b){
    return a + b;
}

当我对此使用gcc -c test.c -o test.o然后objdump -d test.o时,JAL(跳转和链接)指令显示跳转到地址0x00000000,这显然是不正确的,但是当我完全编译了程序,我在objdump命令

中得到了大量的垃圾

我正在使用mips编译器(以及相关的mips-objdump等)进行编译。

我正在编译的程序是自包含的(没有外部库或系统包含文件)。我想要的是转发指令,其中JAL和等效指令指向他们调用的函数的正确地址。

1 个答案:

答案 0 :(得分:1)

虽然您的代码没有链接,但地址可能会或可能不会被解析(绝对地址肯定不会被解决)。在后一种情况下,如果使用objdump -dr,则应该看到重定位条目。如果你链接你的程序,这些问题应该消失,如果程序是独立的(即,甚至不是C库),那么你所看到的应该是你的代码。您可能希望使用-nostdlib切换到gcc。我没有mips可用的mcc,但这里是x86版本的插图:

080480d8 <addition>:
 80480d8:       8b 44 24 08             mov    0x8(%esp),%eax
 80480dc:       03 44 24 04             add    0x4(%esp),%eax
 80480e0:       c3                      ret

080480e1 <main>:
 80480e1:       83 ec 08                sub    $0x8,%esp
 80480e4:       c7 44 24 04 07 00 00    movl   $0x7,0x4(%esp)
 80480eb:       00
 80480ec:       c7 04 24 05 00 00 00    movl   $0x5,(%esp)
 80480f3:       e8 e0 ff ff ff          call   80480d8 <addition>
 80480f8:       83 c4 08                add    $0x8,%esp
 80480fb:       c3                      ret

这就是二进制文件中的所有代码,正如您在80480f3看到的那样call已解决。我希望它对mips有类似的作用。