使用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 關注
- 1208 瀏覽
添加回答
舉報
0/150
提交
取消