2012-01-11 50 views
2

在stackoverflow和其他地方已經有很多帖子詳細說明如何將二進制blob嵌入到精靈二進制文件中。用objcopy將二進制嵌入到elf中可能會導致對齊問題?

Embedding binary blobs using gcc mingw

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

是最完整的答案。

但是沒有人提到可能存在的問題。這裏有一個quicky foo.txt的coverted到foo.o的:

$ 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 

現在,我真的不神交這一切的輸出 - 是有相關文件證明這個東西???我想大部分是明顯的「g」是全球性的,「l」是本地等等等等......

什麼引人注目的是.data段設置爲0.這是否意味着我認爲它手段?即:當談到鏈接,鏈接器會走「啊是啊,無論何地...」

如果你嵌入char數據或工作在x86上,那麼你永遠不會注意到。但是,如果你嵌入int數據或者像我一樣在ARM上嵌入16位和32位數據,那麼你可以在任何時候獲得對齊陷阱。

我的直覺是,這意味着或者objcopy需要另一個選項來指定二進制blob的對齊方式,或者它已損壞,您根本不應該使用此方法。

回答

4

爲了回答我自己的問題,我斷言objcopy在這種情況下被破壞。我相信使用匯編可能是在這裏使用Gnu的最佳方式。不幸的是我現在的linux機器少所以不能正確地測試這一點,但我會在這裏把這個答案的情況下,有人發現了它還是要檢查:

.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

這對我有用。 – 2013-03-16 00:16:08

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的精靈文件。