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