Windows 系统编程中经常把资源(图标、图片、声音等等)链接到程序中,并在程序中访问。 Linux 系统里这种用法好像并不常见。下面我以一个实例来说明如题把普通文件“编译”成目标文件并链接到程序中,以及在程序中访问这些数据。
我们 Grance.jpg 链接到程序中,程序执行时把图片写出到 /tmp/temp.jpg
heihaier@heihaier:~/pic$ ls -l total 324 -rw-r--r-- 1 heihaier heihaier 326342 2009-05-29 09:06 Grace.jpg |
把图片“编译”成目标文件。
objcopy -I binary -O elf32-tradlittlemips -B mips Grace.jpg Grace.o |
具体用法可以看 man objcopy。
查看符号信息。
heihaier@heihaier:~/pic$ nm Grace.o 0004fac6 D _binary_Grace_jpg_end 0004fac6 A _binary_Grace_jpg_size 00000000 D _binary_Grace_jpg_start |
程序代码
/* test.c */ #include <stdio.h> int main(int argc, char * argv[]) { extern char _binary_Grace_jpg_size; extern char _binary_Grace_jpg_start; char * p = &_binary_Grace_jpg_start; FILE * f = fopen("/tmp/temp.jpg", "w+"); if(f) { fwrite(p, sizeof(char), (size_t)&_binary_Grace_jpg_size, f); fclose(f); } return 0; } |
编译命令
gcc test.c Grace.o -o test |
还可以这样啊
是的。Windows 使用的 PE 格式也是这么实现资源的。可惜 Linux 很多库并没有提供这样的接口。