7

ラベル間の C コードから malloc によって割り当てられたメモリにコード セグメントをコピーすることで、VM を「インライン化」しようとしています。したがって、開始ラベルと終了ラベルで定義された Ops があり、次のコードで定義された命令をバッファーにコピーしてから実行したい (これが可能かどうかはわかりません)

OP_PUSH0_START:
    sp += 4; *sp = 0; // I WANT THE INSTRUCTIONS OF THIS LINE COPIED TO THE BUFFER
OP_PUSH0_END:

そうするために、次のコードスニペットが機能すると思いました

void * ptr0 = &&OP_PUSH0_START;
void * ptr1 = &&OP_PUSH0_END;
while(ptr0 < ptr1)
{
    buf[c++] = *ptr0;
    ptr0++;
}
goto buf; //jump to start of buffer

しかし、メモリエラーが発生せずに読み取ることはできません

これを達成するためのリンクや提案があれば幸いです

4

2 に答える 2

3

実行を任意の場所に転送する唯一の正当な方法は、関数ポインタを使用することです。goto配列やその他のものではなく、ラベルにのみジャンプします。

また、ラベルのアドレスを取ることはできません。ラベルはオブジェクトでも関数でもありません。

多くの場合、データ領域がメモリに配置され、その内容を CPU 命令として実行できないことは正しく指摘されています。ただし、多くの場合、これには回避策があります。Windows と Linux は、メモリの領域のパーミッション/権利/特権/呼び名を変更する機能を提供します。

たとえば、Windows で実行しようとしているようなことを実行する例を次に示します。

于 2012-07-12T08:51:13.993 に答える
1

アレクセイの答えに加えて、jit-executor を作成する私自身のサンプルをリンクします。

x86 hex コードを実行できる C プログラムの作成方法

AsmJITライブラリは、完全な実行可能メモリ チャンクを実際に作成する優れた x86/x64 "1 行" アセンブラです。

jit エンジンのポータブル バージョンはLuaJITです。ARM/x86/PowerPC/MIPS アーキテクチャ用の関数トランポリンの作成をサポートしています。

データとコードが同じメモリを共有しないハードウェア アーキテクチャがあるため、「ラベルへのポインタ」に関することは C の標準ではありません。

于 2012-07-12T19:43:59.977 に答える