ARM程序集用clang行走框架指针

时间:2013-08-19 03:32:00

标签: assembly arm clang llvm llvm-clang

我正在使用ARM架构上的-pg编译Clang 3.3的一些代码,我看到一个空的C函数:

void do_nothing() {
}

现在看起来像:

    .section    .text.do_nothing,"ax",%progbits
    .globl  do_nothing
    .align  2
    .type   do_nothing,%function
    .code   16
    .thumb_func
do_nothing:
    .fnstart
.Leh_func_begin1:
.Lfunc_begin1:
    .loc    2 17 0
    .save   {r7, lr}
    push    {r7, lr}
    .setfp  r7, sp
    mov r7, sp
    bl  mcount(PLT)
    .loc    2 17 0 prologue_end
.Ltmp3:
    pop {r7, pc}
.Ltmp4:
.Ltmp5:
    .size   do_nothing, .Ltmp5-do_nothing
.Lfunc_end1:
.Leh_func_end1:
    .fnend

现在我明白了r7用作帧计数器,并且我可以向后走过它的堆栈和当前调用者的lr调用堆栈if -ffunction-section和-no-omit-frame指定了-pointer。但是,当我尝试编写将执行此操作的代码时,它不起作用:

mcount:
        push {r7, lr} @ Save off where to return and current link
        push {r0-r4} @ Save off arguments
        ldr r0, [r7, #4]
        mov r1, lr
        bl MyMCount
        pop {r0-r4}
        pop {r7, pc} @ Restore link and new PC

r0在尝试成为被调用者的lr时肯定是错误的,我相信r1也是因为我使用了mov,所以我没有完整的32位在lr中。

有谁可以指出我做错了什么?

0 个答案:

没有答案