接上一节http://blog.csdn.net/mybelief321/article/details/10040939
说实话,我当时写这个系列的博文的时候,感觉对BusyBox算是有点了解,直到昨天出现问题,今天解决了,才醍醐灌顶,算是知道了BusyBox静态编译和动态编译的区别。首先,说明一下我的问题,以下是我的问题
----------------------------------问题描述开始-------------------------------------------
在配置busybox的时候,我选择的是静态编译,可以出现控制台console,可是我利用交叉编译器编写的hello world程序,一个采用的是静态编译,一个动态编译,随着根文件系统一起制作成镜像文件下载到板子后,其中静态编译的可以执行,动态编译的却不能执行,说是~/bin/sh: ./hello not found。
yaffs_read_super: isCheckpointed 0 开始以为是配置busybox的时候,选择静态编译的原因,于是把它改成动态编译,结果下载到板子上,根本运行不起来,出现Failed to execute /linuxrc. Attempting defaults... Kernel panic - not syncing: No init found. Try passing init= option to kernel. 的错误。请问谁能知道怎么让自己在PC上动态编译的程序,在开发板上也能运行呢?还有这个BusyBox配置的时候,静态编译和动态编译针对的是BusyBox还是别的什么?
VFS: Mounted root (yaffs filesystem) on device 31:3.
Freeing init memory: 156K
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
Backtrace:
[<c00341cc>] (dump_backtrace+0x0/0x10c) from [<c03317d0>] (dump_stack+0x18/0x1c)
r7:00000000 r6:00000000 r5:c001f484 r4:c048a330
[<c03317b8>] (dump_stack+0x0/0x1c) from [<c0331820>] (panic+0x4c/0x114)
[<c03317d4>] (panic+0x0/0x114) from [<c002f598>] (init_post+0xa8/0x10c)
r3:00000000 r2:c3953100 r1:c3953200 r0:c03e37ec
[<c002f4f0>] (init_post+0x0/0x10c) from [<c00084b4>] (kernel_init+0xe4/0x114)
r5:c001f484 r4:c0489ac0
[<c00083d0>] (kernel_init+0x0/0x114) from [<c004bbbc>] (do_exit+0x0/0x620)
r5:00000000 r4:00000000
-------------------------------------------问题描述结束--------------------------------------------
后来受kangear朋友对我问题的解答,以下是他对我出现问题的解答
----------------------------------------------问题解答开始-------------------------------------------------------
关于你说的问题“动态编译的helloworld”不能够运行和busybox关系不大! busybox和helloworld是一个等级的,都是linux应用程序。你的问题在于动态应用程序不能够运行,是你开发板是没有库文件,提示的错误“~/bin/sh: ./hello not found”,也能够证明这一点,把交叉工具链中的armlinuxgccdir/arm-none-linux-gnueabi/lib中的库文件放到你开发板/lib目录下。(用arm-linux-readelf -d a.out也可以看到a.out需要的动态库文件)
-------------------------------------------------问题解答结束----------------------------------------------------
受他的启发,我首先使用 arm-linux-readelf -a hello2 |grep "Shared" 命令,查看了我动态编译的 hello2可执行程序,该程序用到的库是 libc.so.6 ,查看了我根文件系统的 /lib文件夹,但是这个文件明明就乖乖地躺在那里啊。再仔细一想,我这个hello1和hello2编译的是 arm-linux-gcc 4.4.3版本的,但是我之前放置 glibc库的所属版本是arm-linux-gcc 3.4.5版本的,它们的库文件能一样吗?
抱着这个想法,我于是将根文件系统内的 /lib文件夹内的所有的库文件都删掉,然后换成arm-linux-gcc 4.4.3的动态库,我的4.4.3 的动态加载库在本系统的安装路径为:/home/song/software/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/
所以,我将原来的那个 lib 文件夹内的文件全部删掉,然后在该 lib 文件夹内执行命令:cp /home/song/software/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/*.so* ./ ,将4.4.3的动态库全部复制过来。
安装完这些库,我又将 busybox安装在本目录内的 /bin、/sbin、/usr还有 linuxrc删掉,重新配置我的busybox,其他选项和和我前边讲的都一样,唯一不同的就是修改了这一节http://blog.csdn.net/mybelief321/article/details/10001927 的第7步,这里选择动态链接,配置如下
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs)
[ ] Build BusyBox as a position independent executable
[ ] Force NOMMU build
[*] Build shared libbusybox
[*] Produce a binary for each applet, linked against libbusybox
[*] Produce additional busybox binary linked against libbusybox
[*] Build with Large File Support (for accessing files > 2 GB)
然后,再安装到根文件系统内,制作成yaffs2镜像文件,下载到开发板,此时不管是静态编译的程序还是动态编译的程序,都可以支持了,真的太棒了!很开心!
选择动态编译制作好的根文件系统,我打包上传到了网站,如有需要,请自行下载,点此下载
想想真好,这系列文章算是我学习的见证,中间出错,所以对那些看着这篇文章制作根文件系统的朋友产生的不便,说声很抱歉。