1

假设我想嵌入一个data在我的 C 可执行文件中调用的文件。

来自谷歌的结果是这个 linuxjournal 页面,上面写着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 数组中的数据和长度为整数的 ac 源代码,并使用与设备无关的编译命令获得相同的结果。

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

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

4

1 回答 1

2

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

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

一般来说,当需要将二进制文件包含到程序中时,一些简单的东西(就像你做的那样xxd)比objcopy. 主要是,出于一个简单的原因,它的文档严重不足,给人的印象是它是 binutils 的底层库的objcopy一个未完善的前端。BFD另一个原因是,除了.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
于 2014-11-27T22:24:05.220 回答