2014-11-27 8 views
1

data이라는 파일을 C 실행 파일에 임베드하고 싶다고합니다.objcopy와 c 소스로 파일을 xxding하는 것의 차이점

까지 구글에서 제공이 i386 architecture of input file 'data.o' is incompatible with i386:x86-64 output을 제공 이전 명령에서 개체를 컴파일 할 때이 예를 들어, 컴퓨터의 아키텍처에 의존이

objcopy --input binary \ 
     --output elf32-i386 \ 
     --binary-architecture i386 data data.o 

같은 objdump를 사용 말한다 this linuxjournal page입니다 결과 나는 논쟁을 바꾸어야한다.

유닉스 도구 을 사용하면 서명되지 않은 char 배열의 데이터와 길이가있는 정수로 간단히 소스 코드를 만들고 장치 독립적 컴파일 명령으로 동일한 결과를 얻을 수 있습니다.

data.o: data.c 
     gcc -c data.c 
data.c: data 
     xxd -i data > data.c 

선호되는 방법은 무엇이며 그 이유는 무엇입니까?

답변

2

xxd은 표준 UNIX 도구가 아닙니다. 실제로 VIM의 일부이며 16 진수 편집기 기능을 구현하는 데 사용됩니다. VIM은 선택적인 도구이며 보편적으로 사용할 수 없습니다.

반면에 GNU objcopy은 GNU binutils의 일부이며 일반적으로 모든 GNU 시스템에 사전 설치되어 있습니다.

일반적으로 프로그램에 이진 파일을 포함해야하는 경우 objcopy보다 단순한 것 (xxd과 같이)을 사용하는 것이 좋습니다. 주로 objcopy이 심하게 저평가되어 있고 BFD의 binutils의 기본 라이브러리에 대한 마무리되지 않은 프런트 엔드의 인상을 남기는 간단한 이유가 있습니다. 또 다른 이유는 .c 파일과 함께 .h 파일을 만들고 생성 된 파일을 프로젝트의 필수 부분으로 만들 수 있습니다.

귀하가 이미 링크 한 기사에는 그 달성 방법에 대한 몇 가지 예가 있습니다. 아마도 가장 많이 사용되는 도구는 문자 그대로 모든 시스템에 사전 설치된 hexdump입니다. 예를 들어, 내 머리 꼭대기에서 :

# .c 
echo 'char data[] = {' > data.c 
hexdump -v -e '1/1 "0x%02X,"' <data.bin>> data.c 
echo >> data.c 
echo '};' >> data.c 
echo 'size_t data_size = sizeof(data);' 
# .h 
echo 'extern char data[];' > data.h 
echo 'extern size_t data_size;' >> data.h