为了账号安全,请及时绑定邮箱和手机立即绑定

使用GCC的C / C ++:静态地将资源文件添加到可执行文件/库

使用GCC的C / C ++:静态地将资源文件添加到可执行文件/库

梵蒂冈之花 2019-07-31 15:39:45
使用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使用iostreamstd::stringstream虽然不是很好,你当然可以在任何可以使用迭代器的地方使用指针。

如果你在automake中使用它,请不要忘记适当地设置BUILT_SOURCES

这样做的好处是:

  1. 你得到文本,所以它可以在版本控制和补丁明智

  2. 它在每个平台上都是可移植的并且定义良好


查看完整回答
反对 回复 2019-07-31
?
智慧大石

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更多地使用这些参数。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 1138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信