我有简单的 c 程序,例如 my_bin.c:
#include <stdio.h>
int main()
{
printf("Success!\n");
return 0;
}
我用 gcc 编译它并得到可执行文件:my_bin。
现在我想使用另一个 C 程序调用 main(或运行这个 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 使响应更清楚......我想在第二个程序中调用一个外部二进制程序。
我不知道如何用 main(其他程序)的地址初始化函数指针。任何想法?
编辑2:
为什么 seg 错误,在谷歌搜索后发现,这是因为我的 mmap 的大小和偏移量参数。它应该是页面大小的倍数。[参考:在 C 中使用 mmap 读取二进制文件时出现段错误
现在代码看起来像:
#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;
}
仍然有 fun() 或没有它不打印......不知道如何给出 main() 地址。
编辑 2 [已解决]:
第一件事:我没有正确阅读定义,我已经给出了我应该从中读取二进制文件的地址。第二:mmap:size和offset应该是pagesize的倍数。