ヒープに各関数呼び出しのスタックフレームを割り当てたいが、そのために各関数のスタックベースポインタを変更する必要がある。C - スタックベースポインタアドレスを変更する
Linux上でポインタを取得してCで修正する方法はありますか?
ヒープに各関数呼び出しのスタックフレームを割り当てたいが、そのために各関数のスタックベースポインタを変更する必要がある。C - スタックベースポインタアドレスを変更する
Linux上でポインタを取得してCで修正する方法はありますか?
機能alloca()
をご覧ください。その使用はお勧めできませんが、ほとんどのコンパイラには実装があります。
allocaはヒープからではなくスタックから割り当てます – ShinTakezou
gcc関数が見つかりましたvoid * __builtin_frame_address現在の関数のレベル ".0"、呼び出し元のためのレベル ".0"にある関数呼び出しのアドレスを返します。しかし、関数によって返されたポインタに別の値を代入することはできないようです。コンパイラからのセキュリティ制限? – user1311596
@ShinTakezouええ、申し訳ありませんが、元の質問を誤解しました。私の悪い。 – harald
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
これを行う理由を説明するかもしれません。 –
カスタム構造体を使用して引数/戻り値を渡すことはできませんか?ルアと同じように? http://www.lua.org/manual/5.1/manual.html#lua_CFunction – katzenversteher
これを行う唯一の方法は、アセンブラで行うことです。 –