全部博文(166)
分类: LINUX
2010-01-13 15:53:40
注:由于我把工具链的位置添加到了环境变量里,故CROSS_COMPILE = arm-linux-,否则要给出完整的路径。CROSS_COMPILE = /home/mxzh/smartphone/ww21/pxalinux/toolchain/arm-linux-4.1.1/arm-linux-
# make menuconfig
Busybox Settings --->
Build Options --->
[] Build BusyBox as a static binary (no shared libs) //(1)
Installation Options --->
[*] Don't use /usr //(2)
Linux System Utilities --->
[*] mdev //(3)
[*] Support /etc/mdev.conf
[*] Support command execution at device addition/removal
(1) 这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作。如果选中就是静态编译,如果没选中,那么就要拷贝工具链里的库过来,我们这里不选中。
(2) 这个选项也一定要选,否则make install后,busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.
(3) 如果没有启动udev,造成/dev下没有设备文件。也就是说所有的设备都没有挂接进来。最新的busybox已经包含了udev的简化版本即mdev,且使用非常简单。 要使用mdev还需要在rootfs中做适当配置。
同时还要注意把sh命令选上。
再加一些基本的命令就可以了,其余大可不选,用到时再说。
执行make &&make install。
(3)把工具链里的库拷贝到文件系统的lib下
如果是编译成静态的,这一步可以不做。
/home/mxzh/smartphone/ww21/pxalinux/toolchain/arm-linux-4.1.1/bin/arm-iwmmxt-linux-gnueabi-readelf -d busybox
这样就可以查看busybox需要的库
Dynamic section at offset 0x3700c contains 24 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0xa56c
0x0000000d (FINI) 0x33700
0x00000019 (INIT_ARRAY) 0x47000
0x0000001b (INIT_ARRAYSZ) 4 (bytes)
0x0000001a (FINI_ARRAY) 0x47004
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x00000004 (HASH) 0x80e8
0x00000005 (STRTAB) 0x95e8
0x00000006 (SYMTAB) 0x8798
0x0000000a (STRSZ) 1761 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x470f4
0x00000002 (PLTRELSZ) 1664 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x9eec
0x00000011 (REL) 0x9eb4
0x00000012 (RELSZ) 56 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x9e94
0x6fffffff (VERNEEDNUM) 1
0x6ffffff0 (VERSYM) 0x9cca
0x00000000 (NULL) 0x0
如上,需要libc库,拷贝库到文件系统的lib目录下。
$ cd ~/work_test/mkrootfs/rootfs/lib
$ cp -d /home/mxzh/smartphone/ww21/pxalinux/toolchain/arm-linux-4.1.1/arm-iwmmxt-linux-gnueabi/lib/ld* ./
$ cp /home/mxzh/smartphone/ww21/pxalinux/toolchain/arm-linux-4.1.1/arm-iwmmxt-linux-gnueabi/lib/libc.so.6 ./
这样就可以了。
(4)添加命令和初始化脚本
把编译busybox的 生成的_install下的bin,sbin目录拷贝到到文件系统的跟目录下。至于linuxrc,可不作拷贝,只是个链接。
添加 /etc/init.d/rcS 文件 添加自动执行部分
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
#Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
/bin/mount -t proc none /proc
/bin/mount -t tmpfs none /root
/bin/mount -t tmpfs none /tmp
/bin/mount -t tmpfs none /var
/bin/mount -t tmpfs none /dev
/bin/mount -t sysfs none /sys
/bin/mkdir -p /var/lib
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mknod -m 660 /dev/console c 5 1
/bin/mknod -m 660 /dev/null c 1 3
/bin/mknod -m 666 /dev/ptmx c 5 2
/bin/mkdir /dev/shm
/bin/mkdir /dev/pts
echo "Starting mdev ..."
/sbin/mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
然后在文件系统的跟目录执行ln -s bin/busybox test_init。
为了保证可执行,sudo chmod 777 rootfs -R
这样,整个文件文件系统rootfs就做成了。
可以把1、rootfs作为nfs目录供小板挂载了,
2、或者是把rootfs整个目录拷贝到内核目录的顶层,配置内核做ramdis文件系统了。具体配置如下 General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support │ │
│ │ (rootfs) Initramfs source file(s)
这是,还需要在CMDLINE里指定init=/test_init,与上面的ln -s bin/busybox test_init对应。
如果是ln -s bin/busybox linxurc,那么CMDLINE里指定init=/linxurc。
如果是ln -s bin/busybox init,那么CMDLINE里指定init=/init。
具体可参考:http://blog.chinaunix.net/u1/34474/showart_485837.html