我在 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 位。
谁能指出我做错了什么?