编译 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。
有以下非常简单的 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。