我可以用" $ readelf cbinary -a"来检查我的二进制文件的入口点。并通过代码。但是当二进制文件被mmaped然后跳转到那里时如何检查其入口点虚拟adr?
int fd;
int PageSize;
char *fileName = "/home/dssiam/workspace_eclipse/hello/src/cprog";
if ((PageSize = sysconf(_SC_PAGE_SIZE)) < 0) {
perror("sysconf() Error=");
}
if ((fd = open(fileName, O_RDWR, S_IXUSR | S_IXGRP | S_IXOTH)) == -1)
{
perror("err open file:");
exit(1);
}
else
{
fd = open(fileName, O_RDWR, S_IXUSR | S_IXGRP | S_IXOTH);
}
void *address;
int len;
off_t my_offset = 0;
len = PageSize*3; //Map one page
address = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, my_offset);
if (address == MAP_FAILED)
{
perror("mmap error. ");
}
lseek(fd, 24, SEEK_SET);
unsigned long entry_point;
read(fd, &entry_point, sizeof(entry_point)); //IT RETURN entry point adr of my binary at "/home/dssiam/workspace_eclipse/hello/src/cprog" but not in VM
printf("entry: 0x%lx\n", entry_point);
close(fd);
void *ptr = (void *)0x80484b0; // 0x80484b0 - entry_point vaddress
goto *ptr; //no jump here
所以我可以跳到我的主程序的开头,但是我不能跳到二进制文件&#34; cprog&#34;存储在我的hdd和mmaped区域。 任何帮助,将不胜感激。
答案 0 :(得分:1)
代码有很多错误(错误的mmap保护,错误的mmap起始地址,任意页面大小,C标准特别禁止这种计算goto)但最大的问题是这种方法根本不起作用,除了可能最多基本情况。
您不仅可以将elf文件中的单个函数映射到内存中并期望它能够正常工作 - 您需要为可重定位代码执行重定位,甚至对于PIC(位置无关代码),您仍然需要创建GOT。
我猜你真正想要动态加载编译文件,所以使用标准方法执行此操作:将文件编译为.so动态库,然后使用dlopen
/ dlsym
从文件中访问函数。