GCC 编译和 link 原始输出
GCC compile and link raw output
我正在尝试获取带有函数调用的简单 C 程序的原始指令代码输出。
我已经在此处和 Google 上搜索了答案,但只能找到对单个函数(无函数调用)正确的答案。
一个简单的例子:
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
(跳转和 link)指令显示跳转至地址 0x00000000
显然是不正确的,但是当我完全编译程序时,我在 objdump
命令
中得到了大量的垃圾
我正在使用 mips 编译器(以及相关的 mips-objdump 等)进行编译。
我正在编译的程序是自包含的(没有外部库或系统包含文件)。我想要的是指令转储,其中 JAL
和等效指令指向它们调用的函数的正确地址。
虽然您的代码未 linked,但地址可能会也可能不会被解析(绝对地址肯定不会)。在后一种情况下,如果您使用 objdump -dr
,您应该会看到重定位条目。如果你 link 你的程序,那些问题应该消失了,如果程序真的是独立的(即甚至不是 C 库)那么你所看到的应该是你的代码。您可能想使用 -nostdlib
切换到 gcc。我没有可用的 mips gcc,但这里是用于说明的 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 [=10=]x8,%esp
80480e4: c7 44 24 04 07 00 00 movl [=10=]x7,0x4(%esp)
80480eb: 00
80480ec: c7 04 24 05 00 00 00 movl [=10=]x5,(%esp)
80480f3: e8 e0 ff ff ff call 80480d8 <addition>
80480f8: 83 c4 08 add [=10=]x8,%esp
80480fb: c3 ret
这就是二进制文件中的所有代码,正如您在 80480f3
看到的那样,call
已解决。我希望它对 mips 的工作方式类似。
我正在尝试获取带有函数调用的简单 C 程序的原始指令代码输出。
我已经在此处和 Google 上搜索了答案,但只能找到对单个函数(无函数调用)正确的答案。
一个简单的例子:
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
(跳转和 link)指令显示跳转至地址 0x00000000
显然是不正确的,但是当我完全编译程序时,我在 objdump
命令
我正在使用 mips 编译器(以及相关的 mips-objdump 等)进行编译。
我正在编译的程序是自包含的(没有外部库或系统包含文件)。我想要的是指令转储,其中 JAL
和等效指令指向它们调用的函数的正确地址。
虽然您的代码未 linked,但地址可能会也可能不会被解析(绝对地址肯定不会)。在后一种情况下,如果您使用 objdump -dr
,您应该会看到重定位条目。如果你 link 你的程序,那些问题应该消失了,如果程序真的是独立的(即甚至不是 C 库)那么你所看到的应该是你的代码。您可能想使用 -nostdlib
切换到 gcc。我没有可用的 mips gcc,但这里是用于说明的 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 [=10=]x8,%esp
80480e4: c7 44 24 04 07 00 00 movl [=10=]x7,0x4(%esp)
80480eb: 00
80480ec: c7 04 24 05 00 00 00 movl [=10=]x5,(%esp)
80480f3: e8 e0 ff ff ff call 80480d8 <addition>
80480f8: 83 c4 08 add [=10=]x8,%esp
80480fb: c3 ret
这就是二进制文件中的所有代码,正如您在 80480f3
看到的那样,call
已解决。我希望它对 mips 的工作方式类似。