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 的工作方式类似。