使用objcopy和将文件xxding到c源之间的区别

时间:2014-11-27 16:08:25

标签: c embedded-resource objdump xxd

说我想在我的C可执行文件中嵌入一个名为data的文件。

Google提供的结果为this linuxjournal page,表示使用此类objdump

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

然而,这取决于计算机的体系结构,例如,在从前一个命令编译对象时,它会提供i386 architecture of input file 'data.o' is incompatible with i386:x86-64 output,我必须更改参数。

然而,使用unix工具xxd,我只需使用unsigned char数组中的数据和带有长度的整数来生成c源代码,并使用与设备无关的编译命令获得相同的结果。

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

首选方法是什么?为什么?

1 个答案:

答案 0 :(得分:2)

xxd不是标准的UNIX工具。它实际上是VIM的一部分,用于实现其十六进制编辑器功能。 VIM是一个可选工具,并不是普遍可用的。

另一方面,GNU objcopy是GNU binutils的一部分,通常预装在所有GNU系统上。

通常,当需要将二进制文件包含到程序中时,与xxd相比,首选的是简单(与objcopy一样)。主要是因为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