
Eu tenho um daemon binário que depende de outro daemon binário em tempo de execução para existir; Eu não gosto desse arranjo. (Meu código funciona tanto no OS X quanto no Linux. Digo Linux porque acredito que não há problema em assumir apenas elf
a formatação do arquivo)
Eu sabia, xxd
mas felizmente encontrei este post também:Como despejar um arquivo binário como uma string literal C/C++?que usa objdump
.
Eu estava pensando que deveria ser possível criar arquivos obj específicos do arch e, em tempo de execução, fazer uma correspondência assim:
Em pseudo OCaml
match arch with
| Linux_32_bit ->
write_to_file "/tmp/foo" "linux_bin_32";
Child_process.popen "/tmp/foo"
| Darwin_64_bit ->
...
Eu estava pensando que isso deveria funcionar, assumindo que as bibliotecas do binário incorporado existem nos locais apropriados, outros detalhes de implementação.
Isso é possível ou uma perda de tempo?
Responder1
Sua abordagem está perfeitamente correta.
Aqui está um exemplo C que incorpora cat
e, após a execução, grava-o em um arquivo temporário e marca-o como executável:
//$ 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;
}
Funciona bem para mim.