バイナリを埋め込んで実行する、実現可能性

バイナリを埋め込んで実行する、実現可能性

実行時に別のバイナリ デーモンに依存して存在するバイナリ デーモンがあります。この配置は気に入りません。(私のコードは OS X と Linux の両方で動作します。elfファイル フォーマットのみを想定しても問題ないと考えているため、Linux としています)

私は知っていましたxxdが、ありがたいことにこの投稿も見つけました:バイナリ ファイルを C/C++ 文字列リテラルとしてダンプするにはどうすればよいでしょうか?を使用しますobjdump

アーキテクチャ固有の obj ファイルを作成し、実行時に次のように一致させることが可能になるはずだと考えていました。

擬似OCaml

match arch with 
| Linux_32_bit -> 
  write_to_file "/tmp/foo" "linux_bin_32"; 
  Child_process.popen "/tmp/foo"
| Darwin_64_bit ->
  ...

埋め込まれたバイナリのライブラリが適切な場所に存在すること、その他の実装の詳細を前提とすると、これは一見すると機能するはずだと考えていました。

これは可能なのでしょうか、それとも時間の無駄でしょうか?

答え1

あなたのアプローチはまったく問題ありません。

cat以下は、 を埋め込み、実行時にそれを一時ファイルに書き込み、実行可能としてマークするC の例です。

//$ xxd --include /bin/cat
//^ create _bin_cat and _bin_cat_len
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
int main(){
  //TODO: error checking everywhere
  char tmp[] = "/tmp/cat-XXXXXX"; 
  mkstemp(tmp);
  FILE* f = fopen(tmp, "w");
  fwrite(_bin_cat, _bin_cat_len, 1, f);
  fchmod(fileno(f), 0700);
  puts(tmp); //print the name of where the embeded cat got copied to
  return 0;
}

私にとっては問題なく動作します。

関連情報