Incorporar um binário e executá-lo, viabilidade

Incorporar um binário e executá-lo, viabilidade

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 elfa formatação do arquivo)

Eu sabia, xxdmas 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 cate, 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.

informação relacionada