0

我在 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 被用作帧计数器,如果 -ffunction-section 和 -no-omit-frame-pointer 是,我可以向后遍历它以获取当前调用者的堆栈和 lr 堆栈指定的。但是,当我尝试编写将执行此操作的代码时,它不起作用:

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,所以我没有 lr 中的完整 32 位。

谁能指出我做错了什么?

4

0 回答 0