我正在使用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中。
有谁可以指出我做错了什么?