10
我想在Android上進行一些自我修改的本機代碼並在模擬器中運行它。我的示例基於android-ndk的HelloJNI示例。它看起來像這樣:Android上的本機自我修改代碼
#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)();
}
}
問題是這段代碼崩潰了。哪裏不對?
注意:如果實際修改代碼,您需要刷新指令緩存 - ARM上的I和D緩存不相干,因此,您可以在給定位置查看值的事實並不意味着CPU將在嘗試執行時看到它們。 Dalvik在其JIT編譯器實現中使用Linux cacheflush(2)。 – fadden 2010-12-17 00:40:11