分类: LINUX
2010-07-22 16:13:07
cpu: s3c2410; 板子: SMDK2410;
1. “tab”键补全:
Busybox Setting ---> Busybox library Tuning ---> [*] Tab completion
2. 连接/编译选项:
Build option ---> []Build BusyBox as a static binary(no shared libs)
1. 编译:
编译之前,修改Makefile文件:
175 ARCH ?= arm 176 CROSS_COMPILE ?= arm-linux-
然后执行 “make”命令编译BusyBox。 2. 安装:
需要指定安装目录。
make CONFIG_PREFIX=/opt/rootfs/rootfs install
一切完成以后,将会再/opt/rootfs/rootfs目录下生成许多文件。
使用mdev创建设备文件:
在使用之前要先确保内核已经设置了CONFIG_SYSFS 和 CONFIG_TMPFS
(作用是使用mdev为了减少对flash的读写,需要支持sysfs文件系统,还要支持tmpfs文件系统) 1. /etc/fstab:
#device mount_point type option dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
2. /etc/init.d/rcS
#!/bin/sh ifconfig eth0 192.168.0.1 ifconfig lo 127.0.0.1 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
3. /etc/inittab
::sysinit:/etc/init.d/rcS s3c2410_serial0::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r
4. /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shells echo echo -n "Processing /etc/profile... " # no-op echo "Done" echo
5. medv是init进程来启动的,再使用mdev构造/dev之前至少要用到设备文件/dev/console和/dev/null。
可以使用下面两条命令创建:
sudo mknod console c 5 1 sudo mknod null c 1 3
dd if=/dev/zero of=rootfs.img bs=1k count=8192 /sbin/mkfs.ext2 rootfs.img mkdir temp mount rootfs.img temp/ -o loop cp rootfs/* temp/. -fr df -h du -sh umount temp
添加所需的链接库:
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]
所以rootfs如果要跑起来必须需要上面的三个库。
这是我使用的arm-linux toolchain 是4.3.2,因为我之前给rootfs的动态链接库的版本比较老,当我移植qt时,回出现一些莫名其妙的错误。我估计是应为链接库的问题。
最近只要我以更改ld-linux.so.3或ld-linux.so.2和libc.so.6就出现:
“Kernel panic - not syncing: Attempted to kill init!”
然后rootfs就没有启动起来。
之前我使用的是usr/local/arm/4.3.2/arm-non-linux-gnueabi/libc/lib下的*.so文件。
后来才发现使用usr/local/arm/4.3.2/arm-non-linux-gnueabi/libc/armv4t/lib下的文件,就没有问题了。
为了减少运行时库的大小,我们应该使用交叉编译版本即arm-linux-gcc 的strip工具来处理根文件系统的库文件,把二进制文件中的包含的符号表和调试信息删除掉。例:
arm-linux-strip *.s