回答:
これが可能だとは思わない。EXEC(2)システムコールは、常にファイル名または絶対パス(ファイル名は常に必要char*
)。 posix_spawn
ファイル名についても同様の要件があります。
最も近い方法は、出力を名前付きパイプにパイプし、パイプから実行してみることです。シェルは、--x--x--x
ビットが設定されていないファイルの実行を拒否する可能性がありますが、これは動作する可能性があります。でパイプを作成し、mkfifo(1)
それを動作させることができるかどうかを確認します。
別のアプローチは、標準入力を読み取り、temporay領域にファイルを書き込み、そのファイルに--xビットを設定し、forkおよびexecsしてファイルを削除するものを書くことです。iノードとコンテンツは、プログラムの実行が完了するまで残りますが、ファイルシステムからはアクセスできません。プロセスが終了すると、iノードが解放され、ストレージが空きリストに戻されます。
編集: Matが指摘しているように、ローダーは実行可能ファイルのデマンドページングを試みるため、ファイルでランダムシークトラフィックを生成するため、最初のアプローチは機能しません。これはパイプでは不可能です これにより、2番目のような何らかのアプローチが残ります。
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);
memfd.h
使用する場合を除き、ヘッダーは必要ありませんMFD_CLOEXEC
(#! /bin/sh
Linuxのバグが原因でスクリプトが破損しますfexecve()
)。それはそれほど複雑ではありません、あなたはあなたの答えに20行の作業サンプルを含めることができます(例えば、このgit gist-elfexec
それはあなたのドロップイン置換ではありませんが、それはまた指定することを可能にしargv[0]
、バイナリを実行しますパイプからのみ(UUoC必須
.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
。
csh
。