有人知道如何使用 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/