10

Android で自己変更型のネイティブ コードを作成し、エミュレータで実行しようとしています。私のサンプルは、android-ndk の HelloJNI サンプルに基づいています。次のようになります。

#define NOPE_LENGTH 4

typedef void (*FUNC) (void);

// 00000be4 <nope>:
//     be4: 46c0        nop         (mov r8, r8)
//     be6: 4770        bx  lr
void nope(void) {
    __asm__ __volatile__ ("nop");
}

void execute(void){
    void *code = mmap(NULL, NOPE_LENGTH, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

    if (code != MAP_FAILED) {
        memcpy(code, nope, NOPE_LENGTH);

        ((FUNC)code)();
    }
}

問題は、このコードがクラッシュしていることです。なにが問題ですか?

4

1 に答える 1

11

推測でnope()は、Thumb としてコンパイルされましたが、ARM として呼び出しています (mmap が単語境界整列ポインターを返すと仮定します)。Thumb コードを呼び出すには、アドレスの下位ビットを設定する必要があります。次のようなことを試してください:

( (FUNC)(((unsigned int)code)|1) )();

適切に行うには、割り当てられたメモリ (Thumb の場合は 2、ARM の場合は 4) のアライメントを確保し、実行しようとしているコードが Thumb (または ARM) であることを確認し、それに応じてビット 0 を設定する必要があります。

于 2010-12-16T14:44:19.767 に答える