メモリ領域に実行権限をつける(Linux x86)
JITコンパイラ実装のために、メモリに機械語を展開して実行させる。
メモリに機械語を配置するだけではなく、OSの機能を使って実行権限をつける必要がある。
Linuxでは、mprotectというシステムコールを使う。
C言語からmprotectを使うには、sys/mman.hをincludeする。
機械語はわからなかったので、以下のアセンブラをアセンブルしてobjdump -dした。
global main section .text main: mov eax, 28 ret
objdumpの結果。
>> objdump -d a.o a.o: file format elf32-i386 Disassembly of section .text: 00000000 <main>: 0: b8 1c 00 00 00 mov $0x1c,%eax 5: c3
メモリに実行権限をつけて実行させるテスト
#include<stdio.h> #include<stdlib.h> #include<sys/mman.h> #include<unistd.h> void run(){ unsigned char *code; int code_length = 64; if (posix_memalign((void**)&code,sysconf(_SC_PAGESIZE),sizeof(char) * code_length)){ fprintf(stderr,"ERROR MEMALIGN\n"); exit(1); } if (mprotect((void*)code,sizeof(char) * 32,PROT_READ | PROT_WRITE | PROT_EXEC)){ fprintf(stderr,"ERROR MEMPROTECT \n"); exit(1); } //MOV EAX, 28 code[0] = 0xb8; code[1] = 0x1c; code[2] = 0x00; code[3] = 0x00; code[4] = 0x00; //RET code[5] = 0xc3; int res = ((int(*)(void))(code))(); printf("%d\n",res); } int main(void){ run(); return 0; }