有一个go编译的二进制可执行文件。我正在制作一个启动它的主管程序(现在是 fork+execv)。
但是是否可以在不写入磁盘的情况下从字节数组运行它?
如果不是,是否可以在没有名称的情况下启动文件描述符?对 tmpfile 的调用使 readlink 说该文件已被删除。是否可以通过打开描述符或 inode 编号运行?这里的问题就出现了,文件是打开写的,关闭的时候打不开,因为会被彻底删除。
对于这种情况,如果您使用 mkstemp 打开文件,一切正常,但使用 tmpfile
#include "bin.h"
#include <unistd.h>
#include <stdio.h>
// #include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[], char *envp[])
{
int r;
FILE *tmp = tmpfile();
int fd = fileno(tmp);
write(fd, __bin, __bin_len);
fsync(fd);
fchmod(fd, S_IRWXU);
FILE *tmp2 = fdopen(fd, "r");
fclose(tmp);
fd = fileno(tmp2);
pid_t pid;
switch (pid = fork())
{
case -1:
perror("fork");
exit(1);
case 0:
getppid();
//fclose(tmp2);
return 0;
default:
return fexecve(fd, argv, envp);
}
return 1;
}
这样的流浪
.....
openat(AT_FDCWD, "/tmp", O_RDWR|O_EXCL|O_TMPFILE, 0600) = 3
fcntl(3, F_GETFL) = 0x418002 (flags O_RDWR|O_LARGEFILE|O_TMPFILE)
getrandom("\xc1\x83\x35\x01\xbe\xec\x96\x5a", 8, GRND_NONBLOCK) = 8
brk(NULL) = 0x55c875ae0000
brk(0x55c875b01000) = 0x55c875b01000
write(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360d\0\0\0\0\0\0"..., 352808) = 352808
fsync(3) = 0
fchmod(3, 0700) = 0
fcntl(3, F_GETFL) = 0x418002 (flags O_RDWR|O_LARGEFILE|O_TMPFILE)
close(3) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f6e46e76910) = 348850
execveat(3, "", ["./nano"], 0x7ffe01dcd068 /* 60 vars */, AT_EMPTY_PATH) = -1 EBADF (Неправильный дескриптор файла)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=348850, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(-1) = ?
+++ exited with 255 +++
附言 “bin.h”通过xxd -i /bin/nano > ./bin.h
1 个回答