c++ - C/C++ 与 GCC : Statically add resource files to executable/library

标签 c++ linux gcc shared-libraries elf

有人知道如何使用 GCC 将任何资源文件静态编译成可执行文件或共享库文件吗?

例如,我想添加永远不会更改的图像文件(如果这样做,我无论如何都必须替换文件)并且不希望它们在文件系统中存在。

如果这是可能的(我认为这是因为 Visual C++ for Windows 也可以做到这一点),我如何加载存储在自己的二进制文件中的文件?可执行文件是否会自行解析、查找文件并从中提取数据?

也许 GCC 有一个我还没有看到的选项。使用搜索引擎并没有真正吐出正确的东西。

我需要它来处理共享库和普通的 ELF 可执行文件。

最佳答案

更新我越来越喜欢控制 John Ripley's assembly .incbin based solution提供,现在使用它的变体。

我使用 objcopy (GNU binutils) 将二进制数据从文件 foo-data.bin 链接到可执行文件的数据部分:

objcopy -B i386 -I binary -O elf32-i386 foo-data.bin foo-data.o

这为您提供了一个 foo-data.o 对象文件,您可以将其链接到您的可执行文件中。 C 接口(interface)看起来像

/** 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参数。

关于c++ - C/C++ 与 GCC : Statically add resource files to executable/library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4864866/

相关文章:

c++ - 如何使用 Eclipse ubuntu 设置 SDL2

linux - 通过 SSH 访问远程 Git 存储库时使用 su/sudo

c++ - 线程中使用锁是否会使其他不使用锁的线程减慢速度?

linux - 将静态库链接到共享库时是否应该隐藏符号?

c++ - 是否可以编写便于复制初始化的显式构造函数?

c++ - 在 m64 autotools 项目中编译 m32 库

c++ - 如何从 #define 中删除 C 风格的转换,以便我可以在预处理器 #if 中使用它?

Java SystemClipboard 包含额外的字节

c - 有和没有 "-ggdb1"选项的 gcc 调试信息有什么区别?

c++ - 分段故障多项式