Einbetten einer Binärdatei und Ausführen, Machbarkeit

Einbetten einer Binärdatei und Ausführen, Machbarkeit

Ich habe einen Binär-Daemon, der zur Laufzeit von einem anderen Binär-Daemon abhängt, um zu existieren. Diese Anordnung gefällt mir nicht. (Mein Code funktioniert sowohl unter OS X als auch unter Linux. Ich sage Linux, weil ich glaube, dass es in Ordnung ist, nur die elfDateiformatierung anzunehmen.)

Ich wusste davon xxd, habe aber glücklicherweise auch diesen Beitrag gefunden:Wie kann ich eine Binärdatei als C/C++-Zeichenfolgenliteral ausgeben?welches verwendet objdump.

Ich dachte, es müsste möglich sein, architekturspezifische Obj-Dateien zu erstellen und dann zur Laufzeit einen Abgleich wie folgt durchzuführen:

In Pseudo-OCaml

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

Ich dachte, dass dies auf den ersten Blick funktionieren müsste, vorausgesetzt, dass die Bibliotheken und die eingebettete Binärdatei an den richtigen Stellen vorhanden sind und dass weitere Implementierungsdetails vorhanden sind.

Ist das überhaupt möglich oder Zeitverschwendung?

Antwort1

Dein Vorgehen ist völlig in Ordnung.

Hier ist ein C-Beispiel, das einbettet cat, es bei der Ausführung in eine temporäre Datei schreibt und als ausführbar kennzeichnet:

//$ 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;
}

Funktioniert bei mir einwandfrei.

verwandte Informationen