9

外部サーバーからTCP経由で他のバイナリアプリケーションファイルを受信して​​実行する小さな「アプリケーションローダー」プログラムが欲しいのですが。

これを行うには、送信されたファイルをハードディスクに保存し、system()呼び出しを使用して実行します。ただし、ハードドライブに触れることなく、メモリから新しいアプリケーションを起動できるかどうか疑問に思っています。

新しいアプリケーションをロードした後は、ローダーアプリケーションの状態は重要ではありません。私はCに固執することを好みますが、C++ソリューションも歓迎します。また、可能であれば、標準のLinux C関数に固執し、外部ライブラリを使用しないようにしたいと思います。

4

3 に答える 3

5

簡単な答え:いいえ。

長い答え:ディスクに書き出さずにこれを行うことは可能ですが、かなり注意が必要です。理論的には、バイナリを読み取り、メモリをマップし、必要に応じてダイナミックリンクを処理し、制御を転送する独自のelfローダーを作成できますが、これは非常に多くの作業であり、努力する価値はほとんどありません。

次善の解決策は、それをディスクに書き込み、unlinkASAPを呼び出すことです。ディスクは「実際の」ディスクである必要はなく、tmpfsなどでもかまいません。

私が最近使用している代替手段は、完全にコンパイルされたバイナリを渡すのではなく、代わりにLLVMバイトコードを渡すことです。これにより、JIT、解釈、保存を適切に行うことができます。これには、アプリケーションを異種環境で動作させるという利点もあります。

fmemopen、、の組み合わせfilenoを試してみたくなるかもしれませfexecveんが、これは2つの理由で機能しません。

  1. マンページからfexecve()

    「ファイル記述子fdは読み取り専用で開く必要があり、呼び出し元には、参照するファイルを実行する権限が必要です。」

    つまり、ファイルを参照するfdである必要があります。

  2. マンページからfmemopen()

    「これらの関数によって返されるファイルストリームに関連付けられたファイル記述子はありません(つまり、fileno(3)返されたストリームで呼び出されるとエラーが返されます)」

于 2012-05-09T20:39:19.620 に答える
0

Cは、tmpfsファイルシステムをセットアップするよりもはるかに簡単です。プログラム/サーバー/あなたがただできることなら何でも、あなたはハードディスクのインターフェースのすべての利点を持っているでしょうexec。これらのタイプの仮想ファイルシステムは、今日では非常に効率的であり、ページキャッシュには実行可能ファイルのコピーが1つだけ存在します。

Andyが指摘するように、このようなスキームを効率的にするには、ファイルへのバッファ書き込みを使用せずに、(広義には)直接その場で「書き込み」を行う必要があります。

  • 実行可能ファイルのサイズを知っておく必要があります
  • tmpfsにファイルを作成します
  • でそのサイズにスケーリングしますftruncate
  • そのファイルをメモリに「マップ」してmmap、バッファのアドレスを取得します
  • そのアドレスを呼び出しに直接渡してrecv、データを所定の場所に書き込みます
  • munmapファイル
  • execファイルで呼び出す
  • rmファイル。実行可能ファイルがまだ実行されている場合でも実行できます
于 2012-05-09T21:05:25.673 に答える
0

実行可能ファイルをメモリに解凍し、制御をに移して実行可能ファイルを起動するUPXを確認して再利用することをお勧めしますld-linux

于 2012-05-09T21:52:40.993 に答える