【发布时间】:2012-02-08 00:37:18
【问题描述】:
在 stackoverflow 和其他地方有很多帖子详细介绍了如何将二进制 blob 嵌入到 elf 二进制文件中。
Embedding binary blobs using gcc mingw
和
C/C++ with GCC: Statically add resource files to executable/library
是最完整的答案。
但是有一个可能没有人提到的问题。这是一个转换为 foo.o 的快速 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
现在,我并没有真正理解所有这些输出 - 是否有这些东西的文档?我想大部分都很明显,“g”是全局的,“l”是本地的等等......
突出的是 .data 段的对齐设置为 0。这是否意味着我认为的意思?即:当涉及到链接时,链接器会“啊,是的,无论在哪里......”
如果您嵌入 char 数据或正在使用 x86,那么您永远不会注意到。但是,如果您在 ARM 上嵌入 int 数据或 16 位和 32 位数据,那么您可能会在任何时候遇到对齐陷阱。
我的直觉是,这意味着要么 objcopy 需要另一个选项来指定二进制 blob 的对齐方式,要么它被破坏了,你根本不应该使用这种方法。
【问题讨论】: