C - 如何在 ARM64 iOS 汇编中调用 Malloc



我正在尝试从iOS arm64汇编.s文件调用malloc,但是,从 *.m 文件调用_test_malloc,它不会从 _test_malloc() 返回(在iPhone5s上运行)

我误解了什么?

//test_malloc.s
.private_extern _test_malloc
.globl  _test_malloc
.align  2
_test_malloc:
    mov  x0,  #8    
    bl   _malloc    //wordPtr = malloc(8)
    ret

//run_test_malloc.m
    extern uint32_t* test_malloc();
    static void run_test_malloc() {
        uint32_t* ptr = test_malloc();   
    }

您没有保存调用方的链接寄存器内容。 您需要将其保存在函数序言指令中,并且需要在函数尾声中恢复它。 由于您要在堆栈上保存某些内容,因此还需要向下调整堆栈指针,使其保持 16 字节对齐,符合 ABI 的要求。 您需要设置帧指针寄存器,并在函数全部之后将其还原。

我建议反汇编编译器生成的函数,看看这个设置和拆卸是如何完成的。 它是简单的模板代码,几乎在每个函数中都执行相同的操作。

这是我修复它的方法:

.private_extern _test_malloc
.globl          _test_malloc
.align          2
_test_malloc:
    //function prolog
    stp fp, lr, [sp, #-16]!
    mov fp, sp
    orr x0, xzr, #0x8
    bl _malloc         //malloc(8)
    //function epilog
    ldp fp, lr, [sp], #16
    ret lr

相关内容

  • 没有找到相关文章