我正在尝试编译并运行代码片段,它可以在Windows x86或WOW64中运行 但是在Windows x64中,他因访问冲突错误而崩溃。
使用gcc和Microsoft C / C ++编译器进行编译。
/*Microsoft (R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
(x64)cl -W3 -Zi tx.c -Fetx64
(x86)cl -W3 -Zi tx.c -Fetx32
gcc (tdm64-1) 4.7.1
(x64)gcc -m64 -Wall -O2 -o tx64 tx.c
(x86)gcc -m32 -Wall -O2 -o tx32 tx.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int (*fpPUTS)( const char *str ); /*function pointer that takes an const char * as an argument and returns int*/
typedef void (*fpMEMEXEC)( fpPUTS pPuts, char *str ) ;/*function pointer on which first argument is pointer to above function*/
void toMem( fpPUTS pPuts, char *str )
{
pPuts( str );
}
int main(int argc, char* argv[])
{
fpMEMEXEC pMemexec;
pMemexec = (fpMEMEXEC) malloc(4*1024);/* Allocate 4 KB memory space to the function pointer */
memcpy( pMemexec, toMem, 4*1024); /* Copy the content of toMem into newly allocated memory */
pMemexec( puts, "Hello word !!\n"); /* execute it in memory */
return 0;
}
我的问题是,为什么这段代码无法正常运行64位环境? 什么规则没有达到,但应该是为了正确使用这段代码?
答案 0 :(得分:3)
您的系统可能有DEP - Data Execution Prevention。这意味着每个页面都可以是可写或可执行文件,但不能同时写入。
在32位系统上,您需要使用SetProcessDEPPolicy才能为当前进程禁用它。
在64位系统上,您应该使用PAGE_EXECUTE_READWRITE分配 - 类似
pMemexec = VirtualAlloc(0, 4*1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
正如已经指出的那样,不保证它会起作用。