编译busybox的组合:busybox-1.0.0 arm-linux-gcc-2.95.3 (sbc2410等开发板)
busybox-1.1.3 arm-linux-gcc-3.3.2
buxybox-1.7.3 arm-linux-gcc-3.4.1
移植基本过程:
1. 到http://busybox.net/downloads/busybox-1.7.3.tar.bz2下载busybox;
2. 解压busybox1.7.3
tar jxvf busybox-1.7.3.tar.bz2
3. make defconfig
4. make menuconfig
在[build options]中选择[Build busybox as a static binary]
主要是C库的连接方式,安装目录等。
5. make
6. 创建rootfs目录
7. make install
文件系统的制作 luofuchong
可能会出现的错误:
1. 出现如下错误
CC miscutils/taskset.o
miscutils/taskset.c:17: error: parse error before '*' token
miscutils/taskset.c:18: warning: function declaration isn't a prototype
miscutils/taskset.c: In function `__from_cpuset':
miscutils/taskset.c:22: error: `CPU_SETSIZE' undeclared (first use in this function)
miscutils/taskset.c:22: error: (Each undeclared identifier is reported only once
miscutils/taskset.c:22: error: for each function it appears in.)
miscutils/taskset.c:26: warning: implicit declaration of function `CPU_ISSET'
miscutils/taskset.c:26: error: `mask' undeclared (first use in this function)
miscutils/taskset.c: In function `taskset_main':
miscutils/taskset.c:47: error: `cpu_set_t' undeclared (first use in this function)
miscutils/taskset.c:47: error: parse error before "mask"
miscutils/taskset.c:68: warning: implicit declaration of function `CPU_ZERO'
miscutils/taskset.c:68: error: `new_mask' undeclared (first use in this function)
miscutils/taskset.c:69: error: `CPU_SETSIZE' undeclared (first use in this function)
miscutils/taskset.c:71: warning: implicit declaration of function `CPU_SET'
miscutils/taskset.c:78: error: `mask' undeclared (first use in this function)
make[1]: *** [miscutils/taskset.o] Error 1
make: *** [miscutils] Error 2
make menuconfig
找到[Miscellaneous Utilities],去掉[task set]
2. time.c
libbb/time.c:20: error: "CLOCK_MONOTONIC" undeclared (first use in this function)
make menuconfig
去掉Busybox Settings->Busybox Library Tuning->[]Use clock_gettie(CLOCK_MONOTONIC) syscall
建立rootfs目录,可以使用如下脚本文件:
#!/bin/bash
mkdir rootfs
cd rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
chmod 1777 tmp
mkdir usr/bin usr/lib usr/sbin lib/modules
mkdir var/lock var/lib var/log var/run var/tmp
chmod 1777 var/tmp
cd dev/
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
cd ../
注意:执行脚本时,要切换到root用户。
在内核目录执行:
$cd home/arm/linux-2.6.14.1/
$make modules
$make modules_install INSTALL_MOD_PATH=/nfs/rootfs/
例如linuxrc内容如下:
$vim rootfs/linuxrc
#!/bin/sh
echo "Hello linux ,gggggg"
exec /sbin/init
然后修改权限:chmod 775 linuxrc
用密码登录可参考:用busybox制作嵌入式Linux的文件系统http://www.embed.com.cn/downcenter/Article/Catalog34/354.htm
busybox login :启动busybox文件系统后怎么主动提示 用户登陆认证?
在配置BusyBox时都加了getty,passwd,login等命令,也加入了文件group shadow passwd 但还是没有弹出界面,自己输入login后倒是提示你输入用户名和密码
内核启动后加载文件系统,busybox为1.1.3
挂载成功后就直接到
BusyBox v1.1.3 (2007.12.13-06:5
Please press Enter to activate this console.
怎么使启动文件系统立即需要用户验证?
编译工具的选择有两种方式:
ARM开发板:要使用交叉编译,所以我们要指定交叉编译工具的位置,可通过现面的方法实现:
方法一: 修改宿主机的PATH变量,使其包含交叉编译工具的目录;然后在调用make命令时,指定TARGET_ARCH和CROSS变量:make TARGET_ARCH=arm CROSS=arm-linux-。
方法二:新版的busybox可以在配置中设定交叉编译工具的,直接运行make就跟为本机编译busybox没有任何区别了。http://hi.baidu.com/xuym04/blog/item/49d83f6e645415df81cb4ac7.html
动态编译方式,准备链接库:
《ARM微处理器与应用开发》 赖于树 P248
复制链接库的步骤:
$cp /usr/local/arm/3.4.1/arm-linux/lib/
$cp *-*.so ${PRJROOT}/rootfs/lib
$cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib/
$cp libSegFault.so libmemusage.so ${PRJROOT}/rootfs/lib/
这些库文件中包含大量的调试信息,交叉编译工具链提供了一个除去这些调试信息的工具:strip
$arm-linux-strip ${PRJROOT}/rootfs/lib/*.so
参考:基于s3c2440 yaffs2 文件系统的移植http://q.163.com/kjava/blog/www_yin/362652432008269461663/#362652432008269461663
3. 建立动态运行库
# cp -rfd /usr/local/arm/4.0.3/arm-linux/lib/* rootfs/lib/
拷贝经过交叉编译的库文件,参数-d,保持库文件的链接关系。
# rm -rf rootfs/lib/*.a
删除所有的静态库文件。
注:/usr/local/arm/4.0.3/ 为交叉编译工具链的存放目录。
# arm-linux-strip rootfs/lib/*
移除所有的符号信息, 压缩库空间。
如果不知道需要哪些共享库,可以在你写好自己的程序后使用#ld hello 命令来看看需要哪些共享库然后在复制到/lib目录下面!
4 查看共享了哪些库文件
用命令 arm-linux-readelf -a ${program} | grep "shared library"
---------------------------------------------------------------
[root@localhost bin]# pwd
/root/maoyong/busybox-1.4.2/_install/bin
[root@localhost bin]# arm-linux-readelf -a busybox | grep "shared library"
0x00000001 (needed) shared library: [libcrypt.so.1]
0x00000001 (needed) shared library: [libm.so.6]
0x00000001 (needed) shared library: [libc.so.6]
------------------------------------------------------------------
如上所示 要把 /usr/local/arm/3.3.2/arm-linux/lib目录下的
libcrypt.so.1
libm.so.6
libc.so.6
文件是busybox所需的共享库文件,要把它以及和他相关的链接文件拷贝到
你新建的文件系统的 lib 目录。
(注意: libcrypt.so.1 libm.so.6 libc.so.6相关的链接文件也要拷贝到lib目录)