C 将资源添加到ELF对象,分组在一个部分中

C 将资源添加到ELF对象,分组在一个部分中,c,elf,rsrc,C,Elf,Rsrc,我制作的一个小程序包含很多小位图和声音片段,我更愿意将它们包含在二进制文件中(它们无论如何都需要内存映射)。在MS PE/COFF标准中,有一个关于如何包含具有类似于文件系统的层次结构的资源的特定描述(rsrc部分)。我在LinuxELF规范中没有发现类似的内容,因此我假设可以自由地包含这些资源 我想要实现的是,我可以只在一个ELF部分中包含所有资源,每个资源的开头都有一个符号名(这样我就可以从我的C代码中寻址它们)。我现在所做的是使用一个小型NASM文件,该文件具有以下布局: SECTION

我制作的一个小程序包含很多小位图和声音片段,我更愿意将它们包含在二进制文件中(它们无论如何都需要内存映射)。在MS PE/COFF标准中,有一个关于如何包含具有类似于文件系统的层次结构的资源的特定描述(rsrc部分)。我在LinuxELF规范中没有发现类似的内容,因此我假设可以自由地包含这些资源

我想要实现的是,我可以只在一个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代码中并不是很有用,因为这会将代码和数据混合在一个部分中。(此外,这也不实用,因为一旦资源转换为数组,我就无法预览它们)
  • 在每个资源上使用
    objcopy--addsection
    可以工作,但是每个资源都有自己的节(包括头和其他部分)。这似乎有点浪费,因为我要包括大约120个文件(每个文件+/-4K)

您说使用hexarray混合数据和代码是错误的,因为ELF文件在默认情况下会分割数据和代码,特别是,如果您将hexarray定义为常量数组,它将以
.rodata
结束。有关
.rodata
的详细信息,请参阅

使用
objcopy
添加资源应该会在目标文件中创建多个部分,但是它们都应该合并到输出可执行文件中,尽管这样您几乎肯定会有一些额外的填充

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


事实上,我很惊讶这种资源管理在ELF中没有被更多地使用,特别是因为对于许多小文件,它将非常快地提高文件系统性能,因为这样您就只有一个文件要映射,而不是很多文件。

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

建议的包含十六进制数组的解决方案可以使用“\u section”GCC关键字。通过使“数组”文件依赖于构建环境中的二进制“父级”,您仍然可以预览这些文件。