尝试调用PROT#U EXEC'上的代码时出现SEGFULT;d堆
我正在mmap(PROT_READ | PROT_WRITE | PROT_EXEC)ed内存区域中加载一个ELF可执行文件(一个用clang编译的barebones C hello world),从ELF头读取其条目地址,然后在该地址调用代码,如下所示:尝试调用PROT#U EXEC'上的代码时出现SEGFULT;d堆,c,segmentation-fault,loader,C,Segmentation Fault,Loader,我正在mmap(PROT_READ | PROT_WRITE | PROT_EXEC)ed内存区域中加载一个ELF可执行文件(一个用clang编译的barebones C hello world),从ELF头读取其条目地址,然后在该地址调用代码,如下所示: void* bin = ...; //address of the executable in memory: bin[0:1] = 0x7f45 void* entry = bin + read_elf(bin)->entry; //
void* bin = ...; //address of the executable in memory: bin[0:1] = 0x7f45
void* entry = bin + read_elf(bin)->entry; //casts/junk omitted, I get the correct sum of address and offset
((void (*)(void))entry)();
但是,它会出现错误14(GNU/Linux x86_64 3.13)
内存页应已标记为可执行。出了什么问题?在调用
main
函数之前运行的初始化代码在某些地方会出现问题,例如在哪里可以找到命令行参数等。如果不提供这些内容,则会出现未定义的行为和崩溃。我知道,但是在解决这个问题之前,我更愿意让代码首先运行。如果代码期望一个有效的环境能够首先运行,而您没有提供该环境,那么您就不能运行代码。它期望在ebp中有一个分配的堆栈吗?是的,这是它可能期望的事情之一,要获得有效的堆栈。此外,例如,Linux加载程序提供了一个指向命令行参数的指针(始终至少有一个,argv[0]
),如果该指针不正确,您将有未定义的行为。