使用GCC的C / C ++:静态地将资源文件添加到可执行文件/库有没有人知道如何使用GCC将任何资源文件静态编译到可执行文件或共享库文件中?例如,我想添加永远不会改变的图像文件(如果他们这样做,我不得不替换文件),并且不希望它们在文件系统中存在。如果这是可能的(我认为这是因为Visual C ++ for Windows也可以这样做),我如何加载存储在自己的二进制文件中的文件?可执行文件是否解析自身,找到文件并从中提取数据?也许GCC有一个选项,我还没有见过。使用搜索引擎并没有真正吐出正确的东西。我需要这个用于共享库和普通的ELF可执行文件。任何帮助表示赞赏
3 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
使用imagemagick:
convert file.png data.h
给出类似的东西:
/* data.h (PNM). */static unsigned char MagickImage[] = { 0x50, 0x36, 0x0A, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x47, 0x49, 0x4D, 0x50, 0x0A, 0x32, 0x37, 0x37, 0x20, 0x31, 0x36, 0x32, 0x0A, 0x32, 0x35, 0x35, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ....
为了与其他代码兼容,您可以使用它fmemopen
来获取“常规” FILE *
对象,或者std::stringstream
使用iostream
。std::stringstream
虽然不是很好,你当然可以在任何可以使用迭代器的地方使用指针。
如果你在automake中使用它,请不要忘记适当地设置BUILT_SOURCES。
这样做的好处是:
你得到文本,所以它可以在版本控制和补丁明智
它在每个平台上都是可移植的并且定义良好
智慧大石
TA贡献1946条经验 获得超3个赞
我已经开始喜欢John Ripley .incbin
基于程序集的解决方案提供的控件,现在使用一个变体。
我使用objcopy(GNU binutils)将文件foo-data.bin中的二进制数据链接到可执行文件的数据部分:
objcopy -B i386 -I binary -O elf32-i386 foo-data.bin foo-data.o
这为您提供了一个foo-data.o
可以链接到可执行文件的目标文件。C界面看起来像
/** created from binary via objcopy */extern uint8_t foo_data[] asm("_binary_foo_data_bin_start");extern uint8_t foo_data_size[] asm("_binary_foo_data_bin_size");extern uint8_t foo_data_end[] asm("_binary_foo_data_bin_end");
所以你可以做类似的事情
for (uint8_t *byte=foo_data; byte<foo_data_end; ++byte) { transmit_single_byte(*byte);}
要么
size_t foo_size = (size_t)((void *)foo_data_size);void *foo_copy = malloc(foo_size);assert(foo_copy);memcpy(foo_copy, foo_data, foo_size);
如果您的目标体系结构对存储常量和可变数据的位置有特殊约束,或者您希望将该数据存储在.text
段中以使其适合与程序代码相同的内存类型,则可以objcopy
更多地使用这些参数。
- 3 回答
- 0 关注
- 1138 浏览
添加回答
举报
0/150
提交
取消