说我想在我的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
首选方法是什么?为什么?
答案 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