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 が -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
呼び出し先の lr になろうとする r0 はここでは間違いなく間違っています。mov を使用したため、r1 も同様であると考えているため、lr にある完全な 32 ビットはありません。
誰かが私が間違っていることを指摘できますか?