メモリ領域に実行権限をつける(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;
}