芯机智

 找回密码
 立即注册

扫一扫,访问微社区

搜索
热搜: 活动 交友 discuz
查看: 524|回复: 0

在可执行程序中嵌入资源文件(linux环境)

[复制链接]

534

主题

624

帖子

6282

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6282
发表于 2018-3-2 13:42:48 | 显示全部楼层 |阅读模式
gcc似乎没有”资源文件”(windows中的.res)一说,如果要在可执行程序中放入体积比较大的文件,一般是定义一个非常大的数组,将文件的每字节填充数组,这种做法的好处是无平台依赖性。下面的做法更优雅,但似乎只有gcc支持。


转载自:http://hi.baidu.com/yeyingxian/b ... e75e359a5027d8.html


1、首先利用objcopy工具把二进制文件装到一个.o文件中
objcopy -I binary -O elf32-i386 –binary-architecture i386 data.txt data.o


arm环境(s3c6410)
arm-unknow-linux-gnueabi-objcopy -I binary -O elf32-littlearm --binary-architecture arm 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

在终极的分析中,一切知识都是历史;在抽象的意义下,一切科学都是数学;在理性的基础上,所有的判断都是统计。——C.R. Rao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|芯机智 ( 京ICP备18048803号 )

GMT+8, 2019-10-15 07:04 , Processed in 0.154597 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表