你需要调用memprotect函数来使存储prog代码的页面变得可执行。以下代码可以调用该函数,并执行prog中的文本。
#include <unistd.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
char prog[] = {
0x55,
0x48, 0x89, 0xe5,
0xf2, 0x0f, 0x10, 0x05, 0x00, 0x00, 0x00,
0x00,
0x5d,
0xc3,
};
int main()
{
long pagesize = sysconf(_SC_PAGE_SIZE);
long page_no = (long)prog/pagesize;
int res = mprotect((void*)(page_no*pagesize), (long)page_no+sizeof(prog), PROT_EXEC|PROT_READ|PROT_WRITE);
if(res)
{
fprintf(stderr, "mprotect error:%d\n", res);
return 1;
}
typedef double (*dfunc)(void);
dfunc d = (dfunc)(&prog[0]);
double x = (*d)();
printf("x=%f\n", x);
fflush(stdout);
return 0;
}
asm()
函数是否更实用? - Stavr00asm()
(根据 @Stavr00 的评论和 Graham 的回答)而不是其他任何方法,特别是如果您的代码有 任何 可能在与互联网连接或可能与除自己以外的任何人进行交互的硅片上看到日光的可能性。 - Kyle Strand