我正在尝试将一个函数加载到映射的内存缓冲区中,并稍后调用它,因此我制作了一个测试用例来尝试:
auto func() -> void{
asm(
"nop;"
"nop;"
"nop;"
"nop;"
);
}
auto main(int argc, char *argv[]) -> int{
void *exec_mem = mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// check errors here
memcpy(exec_mem, reinterpret_cast<const void*>(func), 5); // size is known
(reinterpret_cast<void(*)()>(exec_mem))(); // function call
munmap(exec_mem, getpagesize());
}
这个很正常,但只要我尝试去做一些简单的事情,就会出现段错误。
我试图执行一个简单的变量赋值,像这样:
int x;
auto func() -> void{
x = 5;
}
现在我的函数调用导致了段错误。我已经适当地更改了缓冲区大小,并确信正确的内存被写入了缓冲区。
我缺少什么重要的信息?为什么我不能这样做?
附言:请不要对我进行不安全代码的演讲,这是一个简单的个人学习练习。