编译 MIPS 以使用分支而不是跳转

Compiling MIPS to use branch instead of jump

有以下非常简单的 c 程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *buffer = (char*)malloc(20);
}

并用 mips-linux-gnu-gcc 编译它,看起来调用被编译为以下指令:

.text:004007EC 24 04 00 14             li      $a0, 0x14
.text:004007F0 8F 82 80 50             la      $v0, malloc      # Load Address
.text:004007F4 00 40 C8 25             move    $t9, $v0
.text:004007F8 03 20 F8 09             jalr    $t9 ; malloc     # Jump And Link Register
.text:004007FC 00 00 00 00             nop

完整的编译命令行为:

mips-linux-gnu-gcc my_malloc.c -o my_malloc.so

但是,我希望将函数调用编译为正常的分支指令:

jal     malloc
li      $a0, 0x14

有人知道如何实现这个结果吗?

您需要告诉编译器使用PLT 进行调用,使用the -mplt option。这需要工具链的其余部分支持 PLT。