在我的《u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统》这篇文章中已经介绍了根文件系统的制作,但它是静态库。在这篇文章中,我主要介绍带有动态库的根文件系统的制作。与上一篇内容重复的地方就不再赘述。
在使用menuconfig配置busybox的时候,只需要修改下列内容即可:
Busybox Settings --->
Busybox Library Tuning --->
[*] Usernamecompletion
[*] Fancyshellprompts
在给根文件系统添加目录和文件的时候,还需要手动添加库文件,即在根文件系统的根目录下创建lib目录:
mkdir lib
然后复制动态链接库到该目录下。
这是因为交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的lib目录下,而我们在移植应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上。由于我使用的交叉编译器是eldk4.2,并且我把它安装到了/opt/eldk4.2目录下,因此链接库的目录是/opt/eldk4.2/arm/lib。
为方便起见,参考网上别人的方法写一个脚本文件来复制动态链接库:
以根用户的身份进入/opt/eldk4.2/arm/lib目录,在该目录下编写一个shell文件——cp.sh,用于复制实际的库,其中我的目标板根文件下的lib目录是/home/zhaocj/rootfs/lib,以下就是该shell文件的内容:
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so /home/zhaocj/rootfs/lib #复制实际的共享库
cp -d $file.so.[*0-9] /home/zhaocj/rootfs/lib #复制符合链接本身
done
cp -d ld*.so* /home/zhaocj/rootfs/lib #复制动态连接器及其符合链接
编写完cp.sh文件后,执行之:
source cp.sh
这样就把链接库复制到/home/zhaocj/rootfs/lib目录下。为了缩小复制过来的链接库的体积,还需要执行下列命令:
arm-linux-strip –s /home/zhaocj/rootfs/lib/lib*
经过以上内容的补充,带有动态库的根文件系统就制作好了。但在开发过程中,我们经常需要PC机与开发板之间传输文件,因此还需要安装rz,sz工具,它是基于zmodem协议的文件传输命令。由于我的PC机中的linux系统——fedora17已经自带了这个工具,因此我只需把rz,sz工具安装到开发板上就行了,即在根文件系统中添加这个工具。
首先,在下列网址内下载安装包:
http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz
解压
tar -xzvf rzsz-3.48.tar.gz
然后进入该目录
cd src
修改Makefile文件
CC = arm-linux-gcc
并且把第四行的OFLAG=-O 改写为
OFLAG= -O -DREGISTERED
否则,编译后,在上传下载完成后都会提示:
**** UNREGISTERED COPY *****
Please read the License Agreement in rz.doc
虽然不影响运行,但还是有碍观瞻。
编译
make posix
最后只需要把编译后生成的sz文件和rz文件复制到根文件系统下的/bin目录就完成了rz,sz工具的安装。
为了测试一下根文件系统传输文件的好坏,我编写了一个最简单的程序——hello.c,如:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
然后交叉编译该文件
arm-linux-gcc -o hello hello.c
用C-Kermit连接linux系统的PC机和开发板,我们的目的是把刚才编译生成的hello文件下载到开发板的temp目录下,并运行:
[root@zhaocj /]# ls
bin etc lib proc sys usr
dev home linuxrc sbin temp
[root@zhaocj /]# cd temp
[root@zhaocj /temp]# rz //接受文件命令,即要求把文件从PC机传输到开发板上
rz ready. Type "sz file ..." to your modem program
�##B010000012f4ced
按ctrl+\,然后按c,进入ckermit命令模式
(Back at zhaochunjiang)
----------------------------------------------------
(/home/zhaocj/) C-Kermit>set protocol zmodem //修改当前的文件传输协议为zmodem
(/home/zhaocj/) C-Kermit>send hello //传输hello文件,该文件就在PC机linux系统的当前目录下
Sending: hello
Bytes Sent: 4943 BPS:6558
Transfer complete
(/home/zhaocj/temp/) C-Kermit>c //回到非命令模式下的串口界面
Connecting to /dev/ttyS0, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
Or followed by ? to see other options.
----------------------------------------------------
rz 3.4801-27-98 finished.
[root@zhaocj /temp]# ./hello //运行hello文件
Hello world!