HEV

如何把普通文件链接到程序中?

· hev

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

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