2014-01-07 119 views
3

我制作的一个小程序包含很多小的位图和声音片段,我希望将它们包含到二进制文件本身中(它们需要存储器映射)。在MS PE/COFF标准中,有关于如何包含具有良好文件系统层次结构的资源(.rsrc部分)的具体描述。我在Linux ELF规范中没有找到类似的东西,因此我认为可以自由地包含这些资源。将资源添加到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 
    ... 

我可以很容易地组装这可以用我的C代码链接的ELF对象。但是,我不喜欢使用assembly,因为这会使我的代码与平台相关。

什么是实现相同结果的更好方法?

这个问题已经被问过计算器,但所提出的解决方案并不适用于我的情况:在C代码十六进制数组是不是真的C/C++ with GCC: Statically add resource files to executable/library 包括资源:

  • 提出了相应的解决办法因为它将代码和数据混合在一个部分中。 (此外,这也不实用,因为一旦它们转换为阵列,我无法预览资源)
  • 在每个资源上都使用objcopy --add-section,但每个资源都有它自己的部分(包括头部和所有这些部分)。这似乎有点浪费,因为我有大约120个文件(每个+/- 4K)。
+1

“__section”GCC关键字可以与提议的包含十六进制数组的解决方案一起使用。通过在构建环境中使“数组”文件依赖于它们的二进制“父母”,您仍然可以预览文件。 –

回答

0

你错了说,使用hexarrays混合数据和代码,ELF文件默认,分裂他们特别是,如果你定义hexarray作为一个常量数组,它会在.rodata结束。有关.rodata的更多详细信息,请参阅an old post of mine

使用objcopy添加资源应该在目标文件中创建多个部分,但是这些部分应该全部合并到输出可执行文件中,但是几乎可以肯定会有一些额外的填充。 Another post on a related topic

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

我真的很惊讶这种资源管理对于ELF并不常见,特别是对于许多小文件,它会很快提高文件系统的性能,因为那样你只有一个文件来映射而不是许多。

0

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