Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 如何添加二进制资源_Gcc - Fatal编程技术网

Gcc 如何添加二进制资源

Gcc 如何添加二进制资源,gcc,Gcc,我有一个项目,需要在可执行文件中有一堆图形文件。由于目标位置没有文件系统,我不能只使用fopen功能。一种方法是将文件内容转换为包含如下变量定义的C源代码 unsigned char file1_content[] = { 0x01, 0x02, ... }; 即使使用转换器工具也很难构建这样的文件 在为每个文件指定变量名的同时,是否有任何方法将二进制文件添加到rdata部分?我考虑使用链接器脚本来实现这一点,但没有找到方法。使用工具并不特别麻烦,这是经典的解决方案。找一些 您只需要在构

我有一个项目,需要在可执行文件中有一堆图形文件。由于目标位置没有文件系统,我不能只使用
fopen
功能。一种方法是将文件内容转换为包含如下变量定义的C源代码

unsigned char file1_content[] = {
   0x01, 0x02, ...
};
即使使用转换器工具也很难构建这样的文件


在为每个文件指定变量名的同时,是否有任何方法将二进制文件添加到rdata部分?我考虑使用链接器脚本来实现这一点,但没有找到方法。

使用工具并不特别麻烦,这是经典的解决方案。找一些

您只需要在构建过程中包含这些“资产构建”步骤,即从Makefile调用该工具。这也意味着只有在源数据发生更改时才运行该工具,这很好

至少GNU链接器(LD)似乎能够将文件放置在输出文件的各个部分中(请参见,如下所示:

.data : { afile.o bfile.o cfile.o }
但这听起来相当麻烦,需要您考虑可执行文件的某些部分,这些部分的级别往往有点太低。此外,它似乎要求输入为对象文件,这使得问题变得循环,因为通用二进制资产不是与链接器兼容的对象文件


我建议使用bin2c方法。

您可以使用链接器选项
--format
以及
-Wl,
将其传递给链接器,如:

gcc -Wl,--format=binary -Wl,myfile.bin -Wl,--format=default
最后将格式设置为默认允许您将链接器切换回标准输入格式

您可以通过简单的汇编程序符号(对于
myfile.bin
,对于
xxx.yyy
,它将是
\u binary\u xxx\u yyy\u start
\u binary\u xxx\u yyy\u end
)从源代码访问二进制资源,如:

接下来使用
数据
。这比自己进行对象复制或使用资源黑客攻击要好得多

UPD:通过一个小例子展开--main输出它自己的对象文件的前四个字节:

#include "stdio.h"
#include "stdint.h"

extern uint8_t data[] asm("_binary_main_o_start");

int
main(void)
{
  fprintf(stdout, "0x%x, 0x%x, 0x%x, 0x%x\n", data[0], data[1], data[2], data[3]);
  return 0;
}
现在编译运行:

$ gcc -o main.o -c main.c 
$ gcc -o main main.o -Wl,--format=binary -Wl,main.o -Wl,--format=default
$ ./main 
0x7f, 0x45, 0x4c, 0x46

如何获取xxx\u end符号或二进制文件的大小?数据的结尾由链接器标记为
\u binary\u xxx\u yyy\u end
并且大小标记为
\u binary\u xxx\u yyy\u size
我可以创建一个包含从二进制文件生成的元素的库(.ar)吗?最后,我想链接这个二进制文件库。
$ gcc -o main.o -c main.c 
$ gcc -o main main.o -Wl,--format=binary -Wl,main.o -Wl,--format=default
$ ./main 
0x7f, 0x45, 0x4c, 0x46