我正在尝试使用函数调用获取简单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
和等效指令指向他们调用的函数的正确地址。
答案 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有类似的作用。