我有一个二进制守护进程,它在运行时依赖于另一个二进制守护进程的存在;我不喜欢这个安排。 (我的代码可以在 OS X 和 Linux 上运行,我说 linux 是因为我相信只假设elf
文件格式是可以的)
我知道xxd
但幸运的是也发现了这篇文章:如何将二进制文件转储为 C/C++ 字符串文字?它使用objdump
.
我认为应该可以创建特定于 arch 的 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
你的方法完全没问题。
下面是一个嵌入 的 C 示例cat
,并在执行时将其写入临时文件,并将其标记为可执行:
//$ 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;
}
对我来说效果很好。