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 が -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 ビットはありません。

誰かが私が間違っていることを指摘できますか?

4

0 に答える 0