私は実行時に他のバイナリデーモンの存在に依存するバイナリデーモンを持っています。私はこの配列が好きではありません。 (私のコードは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;
}
私にとってうまくいきます。