4

我制作的一个小程序包含许多小位图和声音剪辑,我希望将它们包含在二进制文件本身中(无论如何它们都需要进行内存映射)。在 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)。
4

2 回答 2

2

你说使用 hexarrays 混合数据和代码是错误的,因为 ELF 文件默认情况下会拆分它们,特别是,如果你将 hexarray 定义为常量数组,它会以.rodata. 有关更多详细信息,请参阅我的旧帖子.rodata

添加资源objcopy应该在目标文件中创建多个部分,但是它们应该全部合并到输出可执行文件中,尽管几乎可以肯定你会有一些额外的填充。关于相关主题的另一篇文章

如果您想从实际的二进制文件(例如 PNG)转到 ELF,您可以使用另一种选择,您可以使用ldscripts,它允许您构建具有任意部分/符号的 ELF 文件并从文件中读取数据。您仍然需要自定义规则来构建您的 ELF 文件。

实际上,我很惊讶这种资源管理并没有更多地用于 ELF,特别是因为对于许多小文件,它会很快提高文件系统的性能,因为那时你只有一个文件要映射而不是很多。

于 2014-08-01T11:37:33.660 回答
0

如果您的资源不是太大,您可以将它们转换为 C/C++ 源代码,例如,作为 unsigned char 数组。然后您可以将它们作为全局变量访问,并像普通源代码一样编译和链接它们。

于 2016-10-08T02:55:11.893 回答