2012-04-08 10 views
2

ヒープに各関数呼び出しのスタックフレームを割り当てたいが、そのために各関数のスタックベースポインタを変更する必要がある。C - スタックベースポインタアドレスを変更する

Linux上でポインタを取得してCで修正する方法はありますか?

+12

これを行う理由を説明するかもしれません。 –

+0

カスタム構造体を使用して引数/戻り値を渡すことはできませんか?ルアと同じように? http://www.lua.org/manual/5.1/manual.html#lua_CFunction – katzenversteher

+2

これを行う唯一の方法は、アセンブラで行うことです。 –

答えて

-1

機能alloca()をご覧ください。その使用はお勧めできませんが、ほとんどのコンパイラには実装があります。

+3

allocaはヒープからではなくスタックから割り当てます – ShinTakezou

+0

gcc関数が見つかりましたvoid * __builtin_frame_address現在の関数のレベル ".0"、呼び出し元のためのレベル ".0"にある関数呼び出しのアドレスを返します。しかし、関数によって返されたポインタに別の値を代入することはできないようです。コンパイラからのセキュリティ制限? – user1311596

+0

@ShinTakezouええ、申し訳ありませんが、元の質問を誤解しました。私の悪い。 – harald

0

ebpを手動で変更する唯一の(現実的な)方法は、インラインアセンブリであるか、アセンブリで関数を書き込むだけです。アセンブリ関数があれば、このようなことができます(私は実際にx86アセンブリfyiで経験はありません)。

; void function(void* heapPtr) 

function: 
    push ebp 
    mov reg, esp 
    mov esp, [esp+4] 
    mov ebp, esp 
    ... 
    mov esp, reg 
    pop ebp 
    ret 
関連する問題