我制作的一个小程序包含许多小位图和声音剪辑,我希望将它们包含在二进制文件本身中(无论如何它们都需要进行内存映射)。在 MS PE/COFF 标准中,有关于如何包含具有类似文件系统层次结构的资源(.rsrc 部分)的具体描述。我在 Linux ELF 规范中没有找到类似的东西,因此我认为可以自由地包含这些似乎合适的资源。
我想要实现的是,我可以将所有资源仅包含在一个 ELF 部分中,并在每个资源的开头使用一个符号名称(这样我就可以从我的 C 代码中寻址它们)。我现在正在做的是使用具有以下布局的小型 NASM 文件:
SECTION .rsrc
_resource_1:
incbin "../rsrc/file_name_1"
_resource_1_length:
dw $-resource_1
_resource_2:
incbin "../rsrc/file_name_2"
_resource_2_length:
dw $-resource_2
...
我可以轻松地将它组装成一个 ELF 对象,该对象可以与我的 C 代码链接。但是,我不喜欢使用汇编,因为这使我的代码依赖于平台。
实现相同结果的更好方法是什么?
这个问题已经在stackoverflow上被问过,但建议的解决方案不适用于我的情况:
- 此处提出的解决方案:C/C++ with GCC: Statically add resource files to executable/library 在 C 代码中将资源作为十六进制数组包含在 C 代码中并不是很有用,因为它将代码和数据混合在一个部分中。(此外,这也不实用,因为一旦将资源转换为数组,我就无法预览它们)
- 在每个资源上使用
objcopy --add-section
都有效,但是每个资源都有自己的部分(包括标题和所有内容)。这似乎有点浪费,因为我要包含大约 120 个文件(每个 +/- 4K)。