我在x86_64上編寫了一個示例代碼,嘗試執行dynamiclly malloc代碼。 有一個執行dynamiclly malloc代碼時出現「分段錯誤」
程序接收到的信號SIGSEGV,分段故障。 0x0000000000601010在?? ()
0x0000000000601010是bin的位置,有人能說出原因嗎?謝謝!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/mman.h>
volatile int sum(int a,int b)
{
return a+b;
}
int main(int argc, char **argv)
{
char* bin = NULL;
unsigned int len = 0;
int ret = 0;
/*code_str is the compiled code for function sum.*/
char code_str[] ={0x55,0x48,0x89,0xe5,0x89,0x7d,0xfc,0x89,
0x75,0xf8,0x8b,0x45,0xf8,0x03,0x45,0xfc,0xc9,0xc3};
len = sizeof(code_str)/sizeof(char);
bin = (char*)malloc(len);
memcpy(bin,code_str,len);
mprotect(bin,len , PROT_EXEC | PROT_READ | PROT_WRITE);
asm volatile ("mov $0x2,%%esi \n\t"
"mov $0x8,%%edi \n\t"
"mov %1,%%rbx \n\t"
"call *%%rbx "
:"=a"(ret)
:"g"(bin)
:"%rbx","%esi","%edi");
printf("sum:%d\n",ret);
return 0;
}
你試過調試器嗎? – 2012-08-05 06:13:02
是的,我用gdb。 – hellolwq 2012-08-05 06:17:35
它給你一個錯誤代碼? – ChiefTwoPencils 2012-08-05 06:19:13