[培训新人系列之1] 作嵌入式,一定要学会裁减

来源:互联网 发布:ubuntu提示命令找不到 编辑:程序博客网 时间:2024/04/25 10:11

作嵌入式,一定要学会裁减

嵌入式的板子上最典型的就是没有挂硬盘(网络存储产品除外), 就是flash 一般就是 12M差不多。 我们的jk241064M 应该算比较大的了,奢侈!!

     所在嵌入式的板子上搞移植, 摆在面前首要问题, 就是万一放不下怎么办?  那产品就必然缺少某种功能。
   
裁减: 4 条路,
 1>
strip

strip作用是删除程序中的一些对调试有用的符号信息和section信息.详见另一片文章<<程序减肥三步走>>

对于我们的jk2410 就是arm-9tdmi-linux-gnu-strip, 比如要减小程序sshd的大小:

 arm-9tdmi-linux-gnu-strip sshd        ,可以加通配符号  arm-9tdmi-linux-gnu-strip  ./*
2>
这步才是最关键的,初学者总是 ./configure --prefix=/work/bob  一堆交叉编译参数, && make && make install. 结果,有用没有用的,统统copy /work/bob/下面来了。这显然不是嵌入式之道,如果都这么玩,板子的flash再大,也是放不下的。
     
要考虑哪些是有用的,哪些是没有用的,举个最简单的例子,man这个目录肯定没有用,你copy到板子上去干吗呢?  

我的经验是,举个mysqld的例子:思路就是一个一个的往板子里面放,需要的一个不少,不需要的一个不多

下面的例子,可能我的记性有误,就这个意思吧
    
先运行mysqld 系统提示少了某些*.so 文件, 我就copy到板子(也可以nfs均可)
     
再运行发现少了  /sbin/xx 文件, copy过来。
     
再运行,提示必须创建某些数据库 然后我把脚本copy到板子上去。
     
又发现 hostname好像不对, 再设置hostname
     
最后,发现 /tmp/ 权限不够, chmod -R 777 /tmp/  

最后,mysqld --user=root   然后ps 死活没有mysqld
     
杀手锏(绝对必杀):strace strace -f -F -o bob.log mysqld --user=root ,
     
发现好像说是没有/dev/urandom ,好家伙,那就mknod 好了。最后终于跑起来了,我发现好多东西都没有用,我记录下来,重新修改Makefilemake install的时候,只copy刚才需要的file 。而且一定要arm-9tdmi-linux-gnu-strip先。
3>
这步,就比较高级一些了。如果上面两条都做过了。size还是太大,没有办法,只能改代码了。把我们不需要得功能得代码统统删除掉了。
     
比如 mysql,有些功能我们就不需要,干脆删掉好了。编译之后,空间又小了很多。 再说了, kernel 就是个典型得例子,400MBcode,编译出来得uImage1M,奇迹!

4> My God! 经过上面三条,size还是太大,仍然放不下,没有办法了,找老板:老板,我得flash太小了,放不下某个功能得binary,强烈要求换一个大点得flash”

 

原创粉丝点击