Внедрение двоичного файла и его выполнение, осуществимость

Внедрение двоичного файла и его выполнение, осуществимость

У меня есть двоичный демон, существование которого зависит от другого двоичного демона во время выполнения; мне не нравится такая организация. (Мой код работает как в OS X, так и в Linux. Я говорю Linux, потому что считаю, что можно только предполагать elfформатирование файла.)

Я знал об этом 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

Ваш подход совершенно нормальный.

Вот пример на языке 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;
}

У меня все отлично работает.

Связанный контент