Linux:执行手动加载到内存的代码
发布时间:2020-12-14 01:12:46 所属栏目:Linux 来源:网络整理
导读:我正在使用 Linux上的函数指针并尝试执行此C程序: #include stdio.h#include string.hint myfun() { return 42;}int main(){ char data[500]; memcpy(data,myfun,sizeof(data)); int (*fun_pointer)() = (void*)data; printf("%dn",fun_pointer()); return
我正在使用
Linux上的函数指针并尝试执行此C程序:
#include <stdio.h> #include <string.h> int myfun() { return 42; } int main() { char data[500]; memcpy(data,myfun,sizeof(data)); int (*fun_pointer)() = (void*)data; printf("%dn",fun_pointer()); return 0; } 不幸的是,它在fun_pointer()调用上发生了段错误.我怀疑它与一些内存标志有关,但我没有找到有关它的信息. 你能解释为什么这段代码会出现错误吗?没有看到固定的数据数组大小,没有调用函数成功就可以了. UPD:最后我发现应该使用调用PROT_EXEC标志的mprotect系统调用将内存段标记为可执行文件.此外,应按照POSIX规范中的规定,通过mmap函数返回内存段. #include <stdio.h> #include <string.h> #include <sys/mman.h> int myfun() { return 42; } int main() { size_t size = (char*)main - (char*)myfun; char *data = mmap(NULL,size,PROT_EXEC | PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,0); memcpy(data,size); int (*fun_pointer)() = (void*)data; printf("%dn",fun_pointer()); munmap(data,size); return 0; } 此示例应符合-fPIC gcc选项,以确保函数中的代码与位置无关. 解决方法
那里有几个问题:
>您的数据阵列保持在data segment,而不是code segment. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |