一尘不染

从另一个进程的内存中执行一个进程?

linux

我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。

我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。

加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux
C函数,并且尽可能不使用任何外部库。


阅读 294

收藏
2020-06-07

共1个答案

一尘不染

简短的回答:不。

长答案:不写到磁盘就可以这样做,但很棘手。从理论上讲,您可以编写自己的elf加载器,该加载器读取二进制文件,映射一些内存,根据需要处理动态链接,然后转移控制权,但这需要进行大量工作,这几乎是不值得的。

下一个最佳解决方案是将其写入磁盘并尽快调用取消链接。该磁盘甚至不必是“实际”磁盘,它可以是tmpfs或类似磁盘。

我最近使用的替代方法是不传递完整的已编译二进制文件,而是传递LLVM字节码,然后可以将其适当地进行JIT
/解释/保存。这还具有使您的应用程序在异构环境中工作的优势。

它可能是很有诱惑力尝试的组合fmemopenfileno并且fexecve,但这并不原因有二:

  1. fexecve()联机帮助页:

“文件描述符fd必须以只读方式打开,并且调用者必须有权执行 它所引用的文件

即它必须是引用文件的fd。

  1. fmemopen()联机帮助页:

“没有与这些函数返回的文件流关联的文件描述符(即,fileno(3)如果在返回的流上调用将返回错误)”

2020-06-07