我想获取一段代码,将其复制到一个全局数组中并从那里执行它。
换句话说,我试图将一堆指令从代码部分复制到数据部分,然后设置程序计数器以继续从数据部分执行程序。
这是我的代码:
#include <stdio.h>
#include <string.h>
typedef void(*func)();
static void code_section_func()
{
printf("hello");
}
#define CODE_SIZE 73
// I verified this size in the disassembly of 'code_section_func'
static long long data[(CODE_SIZE-1)/sizeof(long long)+1];
// I am using 'long long' in order to obtain the maximum alignment
int main()
{
func data_section_func = (func)data;
memcpy((void*)data_section_func,(void*)code_section_func,CODE_SIZE);
data_section_func();
return 0;
}
我可能天真地认为它可以工作,所以我很乐意得到解释为什么它没有。
例如,程序加载到内存后,MMU 是否将指令提取限制在进程内存地址空间内的特定区域(即程序的代码段)?
对于协议,我在 64 位操作系统和基于 x64 的处理器上使用 VS2013 编译器对此进行了测试。
谢谢