ヒープメモリに実行権限を与える件
最近の(※要出典)LinuxやらMac OS Xやらでは素直に配列やmallocした領域を実行しようとしてもエラーになるようです。
mprotectでEXECビットを有効にしてやれば動く模様。
#include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <stdlib.h> int main(void) { char *addr; size_t psize; #ifdef BSD psize = getpagesize(); #else psize = sysconf(_SC_PAGESIZE); #endif if((posix_memalign((void **)&addr, psize, psize))) err(1, "posix_memalign"); if(mprotect((void*)addr, psize, PROT_READ | PROT_WRITE | PROT_EXEC)) err(1, "mprotect"); addr[0] = 0xc3; //ret ((void(*)(void))addr)(); return 0; }
※#ifdef BSDしてるのは、OpenBSDで動かそうという執念ではなくて、そもそもこうしないとMac OS Xで動かないから