是否可以执行存储在char数组中的原始二进制文件?我尝试这样做:
#include "stdio.h"
int main(int argc, char **argv)
{
FILE *f = fopen(argv[1],"r");
if(!f)
return 1;
fseek(f,0,SEEK_END);
long l=ftell(f);
rewind(f);
char *buf = malloc(l+1);
fread(buf,1,l,f);
fclose(f);
void (*func)() = (void(*))buf;
func();
}
Run Code Online (Sandbox Code Playgroud)
但它只给我的段错误.我正在研究自己的操作系统(从头开始),所以我摆脱了它们.
抱歉,这不是一个答案,但它太长,不适合作为评论......
我将假设将原始二进制文件读取到缓冲区中的文件的意图是将代码字节输入RAM,并且您希望执行这些字节.假设您已经修复了文件I/O,所以现在您有一个包含代码字节的缓冲区.有几个原因导致你仍然可能出现段错误.
首先,您的O/S是否实现了具有读取,写入和执行等页面属性的虚拟内存?大多数现代操作系统都不允许您在未标记为代码的页面上执行代码.(以这种方式标记页面对于了解可以交换的内容以及防止恶意编码非常重要.)
第二,你加载的二进制代码是完全可重定位的吗?换句话说,如果代码中有任何JUMP,它们都是相对的吗?如果它们中有任何绝对的JUMP操作,那么你需要通过一个补丁运行它们,直到缓冲区在内存中.
三,二进制代码是100%自包含的吗?如果它调用任何外部函数,那么你也需要修补它们.
最后,二进制代码是否需要访问数据?如果是这样,所有数据也都在二进制文件中,也是相对地址与绝对数据.