Answers:
我不认为这是可能的。在EXEC(2)系统调用总是需要的文件名或绝对路径(文件名是总是一个char*
)。 posix_spawn
对文件名也有类似的要求。
您最能做的是将输出通过管道传递到命名管道,然后尝试从管道执行。尽管外壳程序可能会拒绝执行任何未--x--x--x
设置位的文件,但这可能会起作用。使用创建管道,mkfifo(1)
然后查看是否可以使用它。
另一种方法是编写一些东西来读取标准输入,将文件写入到临时区域,在其上设置--x位,派生并执行然后删除该文件。索引节点和内容将一直保留到程序完成执行,但无法通过文件系统访问。当进程终止时,将释放索引节点,并将存储返回到空闲列表。
编辑:正如Mat指出的那样,第一种方法将行不通,因为加载程序将尝试在可执行文件中进行请求分页,这将在文件上生成随机查找流量,而这在管道上是不可能的。这就留下了第二种方法。
使用memfd syscall的解决方案:https : //github.com/abbat/elfexec
它将在内存中创建一个命名文件描述符,该描述符可以在中使用exec
。伪代码:
#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);
.o
文件写入/ tmp,如果不能,则死掉。
这将自动运行代码的编译,但是会(临时)在文件系统上创建一个文件来执行此操作。
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(我目前正在对此进行测试,但是我可以肯定的是,或者接近它的东西可以为您工作)
编辑:如果管道的目标是从速度方程式中削减物理磁盘,请考虑创建一个ram磁盘来保存中间文件。
csh
。
就像@TheQUUX所建议的一样,我还没有对它进行自我测试,但是您可能想试试cling
-“基于LLVM和Clang库构建的交互式C ++解释器”。
在此处查找更多信息:https : //cdn.rawgit.com/root-project/cling/master/www/index.html
csh
。