ヒープメモリに実行権限を与える件

最近の(※要出典)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で動かないから