바이너리를 내장하고 실행, 타당성

바이너리를 내장하고 실행, 타당성

나는 런타임에 다른 바이너리 데몬의 존재에 의존하는 바이너리 데몬을 가지고 있습니다. 나는 이 배열을 좋아하지 않습니다. (내 코드는 OS X 및 Linux에서 실행됩니다. elf파일 형식이 괜찮다고 가정하기 때문에 Linux라고 말합니다 .)

알고 있었지만 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

당신의 방법은 완전히 괜찮습니다.

cat다음은 이를 포함 하고 실행 시 임시 파일에 기록하여 실행 파일로 표시하는 C 예제입니다 .

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

나에게 잘 작동합니다.

관련 정보