我有一个像,my_bin.c简单的C程序:
#include <stdio.h>
int main()
{
printf("Success!\n");
return 0;
}
我用gcc编译,并得到执行:my_bin。
现在,我想用另一种C程序来调用主(或者运行my_bin)。 那我做了MMAP和函数指针这样的:
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
void (*fun)();
int fd;
int *map;
fd = open("./my_bin", O_RDONLY);
map = mmap(0, 8378, PROT_READ, MAP_SHARED, fd, 0);
fun = map;
fun();
return 0;
}
编辑1:添加PROT_EXEC制作它的响应更加清晰......我想打电话给第二个程序内的外部二进制程序。
我不知道如何初始化函数指针与主(其它程序)的地址。 任何想法?
编辑2:
为什么赛格故障,谷歌搜索后,想通了,它因为我的尺寸和偏移MMAP的说法。 它应该是多个页面大小的。 [参考:段错误,同时使用MMAP用C用于读取二进制文件
现在,代码如下:
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
int main()
{
void (*fun)();
int fd;
int *map;
int offset = 8378;
int pageoffset = offset % getpagesize();
fd = open("./my_bin", O_RDONLY);
if(fd == -1) {
printf("Err opening file\n");
return -1;
}
map = mmap(0, 8378 + pageoffset, PROT_READ|PROT_EXEC,
MAP_SHARED, fd, offset - pageoffset);
perror("Err\n"); //This is printing err and Success!
//fun = map; // If I uncomment this and
//fun(); // this line then, still it
// print err and Success! from perror
// but later it says Illegal instruction.
return 0;
}
仍与乐趣()或无其不打印...不知道如何给main()的地址。
编辑2 [解决]:
第一件事:我没看过定义从中我应该读二进制文件正确,我已经给定的地址。 第二:MMAP:大小和偏移量应该是多个页面大小的。