1. 程式人生 > >如何在可執行程式中嵌入資原始檔(linux環境)

如何在可執行程式中嵌入資原始檔(linux環境)

gcc似乎沒有”資原始檔”(windows中的.res)一說,如果要在可執行程式中放入體積比較大的檔案,一般是定義一個非常大的陣列,將檔案的每位元組填充陣列,這種做法的好處是無平臺依賴性。下面的做法更優雅,但似乎只有gcc支援。

1、首先利用objcopy工具把二進位制檔案裝到一個.o檔案中
objcopy -I binary -O elf32-i386 –binary-architecture i386 data.txt data.o

可以看到這個.o之中包含了符號

$ nm data.o
0000001c D _binary_data_txt_end
0000001c A _binary_data_txt_size
00000000 D _binary_data_txt_start

_binary_data_txt_start是存放data.txt的起始位置,_binary_data_txt_size是data.txt檔案大小

2、寫一個c程式,在裡面使用這些二進位制資源

/* main.c */
#include 
extern int _binary_data_txt_end;
extern int _binary_data_txt_size;
extern int _binary_data_txt_start;

int main(void)
{
   int size = (int)&binary_data_txt_size;
   char *data = (char *)&binary_data_txt_start;
   char *end = (char *)&binary_data_txt_end;
   printf("taille: %d\n", size);
   printf("buffer: %s", data);
   printf("start: 0x%p ; end: 0x%p\n",data,end);
   return 0;
}

3、編譯、連結
gcc -o test main.c data.o

參考

http://www.finiderire.com/post/2009/06/02/Et-un-fichier-exe-pour-les-gouverner-tous

http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967