2012-01-11 4 views
2

이진 블롭을 elf 바이너리에 임베드하는 방법을 자세히 설명하는 stackoverflow 및 기타 장소에 대한 게시물이 많이 있습니다.objcopy로 elf에 바이너리를 삽입하면 정렬 문제가 발생할 수 있습니까?

Embedding binary blobs using gcc mingw

과 가장 완벽한 대답 인

C/C++ with GCC: Statically add resource files to executable/library

.

하지만 아무런 언급이없는 문제가 있습니다. 여기에 quicky은 foo.o하는 coverted에 foo.txt 것 : 이제

$ objdump -x foo.o 
foo.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .data   0000000d 00000000 00000000 00000034 2**0 
        CONTENTS, ALLOC, LOAD, DATA 
SYMBOL TABLE: 
00000000 l d .data 00000000 .data 
0000000d g  .data 00000000 _binary_foo_txt_end 
0000000d g  *ABS* 00000000 _binary_foo_txt_size 
00000000 g  .data 00000000 _binary_foo_txt_start 

, 나는 정말이 모든 출력을 grok 수 없습니다 - 문서가이 물건이 ??? 나는 그것의 대부분이 충분히 "g"는 세계적이고 "l"은 지역 등이라고 생각한다.

. 무엇이 가장 중요한지는 .data 세그먼트의 정렬이 0으로 설정되었다는 것이다. 방법? 예 : 링크 할 때, 링커는 "아, 네, 어디든 ..."이라고 말합니다.

char 데이터를 임베드하거나 x86에서 작업하는 경우에는 알 수 없습니다. 그러나 int 데이터를 삽입하거나 ARM에서 16 비트 및 32 비트 데이터를 작성하는 경우 언제든지 정렬 트랩을 얻을 수 있습니다.

objcopy는 이진 BLOB의 정렬을 지정하는 또 다른 옵션이 필요하거나 깨 졌으므로이 방법을 전혀 사용하지 않아야한다는 느낌입니다.

답변

4

내 자신의 질문에 대답하기 위해이 인스턴스에서 objcopy가 손상되었다고 주장합니다. Gnu를 사용하여 어셈블리를 사용하는 것이 가장 좋은 방법이라고 생각합니다. 불행하게도, 난 리눅스 머신이없는 그래서 이것을 제대로 테스트 할 수 없습니다 지금이야하지만 난 누군가를 찾거나 확인하고 싶은 경우에 여기에이 대답을 놓을 게요 :

.section ".rodata" 
.align 4 # which either means 4 or 2**4 depending on arch! 

.global _binary_file_bin_start 
.type _binary_file_bin_start, @object 
_binary_file_bin_start: 
.incbin file.bin 

.align 4 
.global _binary_file_bin_end 
_binary_file_bin_end: 

밑줄이 자신을 성가 시게하는 전통적인 방법입니다 C/asm 상호 운용성. 즉, Windows에서 MS/Borland 컴파일러와 함께 사라집니다.

+0

이것은 나를 위해 일했습니다. –

2

는 링커 스크립트 "lscript.ld"

MEMORY 
{ 
    memory : ORIGIN = 0x00000000, LENGTH = 0x80000000 
} 

SECTIONS 
{ 
.data (ALIGN(4)) : { 
    *(.data) 
    *(.data.*) 
    __data_end = .; 
} > memory 

.text (ALIGN(4)) : { 
    *(.text) 
    *(.text.*) 
    __text_end = .; 
} > memory 

_end = .; 
} 

만들기 링크 파일 :

gcc -Wl,-T -Wl,lscript.ld -o linked_foo.elf foo.o 

가 연결에 추가 된 모든 불필요한 물건 찾기 : 다시

objdump -x linked_foo.elf 

objcopy의를, 여분의 물건을 제거하려면 :

objcopy --remove-section ".init_array" (repeat as necessary) --strip-all --keep-symbol "_binary_foo_txt_start" --keep-symbol "_binary_foo_txt_end" --keep-symbol "_binary_foo_txt_size" linked_foo.elf final_foo.elf 

2 * 2 alignement에서 엘프 파일을 가져옵니다.