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

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

런타임에 존재하는 다른 바이너리 데몬에 의존하는 바이너리 데몬이 있습니다. 나는 이 배열을 좋아하지 않는다. (내 코드는 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;
}

나에게는 잘 작동합니다.

관련 정보