ubuntu下使用qemu模拟ARM(四)-------编译busybox

来源:互联网 发布:数据质量系统 编辑:程序博客网 时间:2024/04/28 05:29

上面已完成了u-boot,kernel现在我们来做一个根文件系统


用busybox制作根文件系统

1.下载Busybox,

官方下载地址:https://busybox.net/downloads/
下载最新版 busybox-1.26.2.tar.bz2
sudo mkdir root_system 将下载后的文件放入/qemu_arm/root_system中

2.解压

book@book-virtual-machine:/qemu_arm/root_system$ tar xjf busybox-1.26.2.tar.bz2 

3.编译

make clean
make menuconfig

在”Busybox Settings ---> Build Options --->“ 关闭“Build BusyBox as a static binary。
打开”Build shared libbusybox“。
关闭”Produce a binary for each applet“与”Produce additional busybox binary“。
保存退出

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install

生成的文件就放在_install目录中了

4.查看要用到的动态库

方式1:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ arm-none-linux-gnueabi-readelf -d busybox| grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ 

方式2:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ arm-none-linux-gnueabi-objdump -x busybox| grep NEEDED
  NEEDED               libm.so.6
  NEEDED               libc.so.6
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ 

方式3:
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ strings busybox | grep lib
/lib/ld-linux.so.3
libm.so.6
libc.so.6
__libc_start_main
/lib/modules
/var/lib/misc/udhcpd.leases
/lib/firmware
/var/lib/dpkg/info/%s.%s
/var/lib/dpkg/status
/var/lib/dpkg/status.udeb
/var/lib/dpkg/status.udeb.bak
shlibs
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ 

方式4:
ldd busybox

显示:not a dynamic executable     //不知为什么 ,原因有待查找

//-------------应该显示为下面的提示才是正确的-----------------
linux-gate.so.1 =>  (0xb775d000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76ea000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7530000)
        /lib/ld-linux.so.2 (0x800ab000)
//--------------这说明 linux.so.2的库还是存在依赖关系-------------



5.将编译后的文件拷到一个文件夹(rootfs)中:

 sudo mkdir rootfs
sudo chmod 777 rootfs/
sudo cp busybox-1.26.2/_install/* -r rootfs/

6.将busybox-1.26.2/examples/bootfloppy下的etc文件夹拷到rootfs文件夹中
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mkdir etc
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 etc

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo cp -r /qemu_arm/root_system/busybox-1.26.2/examples/bootfloppy/etc/* etc/

6.拷贝链接文件

查找libm.so.6文件位置
 book@book-virtual-machine:/qemu_arm/root_system/rootfs$ arm-none-linux-gnueabi-readelf -d bin/busybox | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ locate libm.so.6 //查找在哪里
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libm.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libm.so.6   //我们拷这个文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libm.so.6

/lib/i386-linux-gnu/libm.so.6

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ 


查找libc.so.6文件位置
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ locate libc.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/armv4t/lib/libc.so.6
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/libc.so.6  //我们拷这个库文件
/arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/thumb2/lib/libc.so.6
/lib/i386-linux-gnu/libc.so.6

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ 

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mkdir lib
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo chmod 777 lib

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ cp /arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/lib*.so.6 lib   //文件库没拷全,启动时会提示 Kernel panic - not syncing: No working init found. 

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ cp /arm-none-linux-gnueabi/arm-2014.05/arm-none-linux-gnueabi/libc/lib/*.so* lib


7.创建4个tty端终设备

book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mkdir dev
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty1 c 4 1
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty2 c 4 2
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty3 c 4 3
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ sudo mknod dev/tty4 c 4 4


8.制作根文件系统镜像

1. 生成32M大小的镜像
 busybox-1.26.2  busybox-1.26.2.tar.bz2  rootfs
book@book-virtual-machine:/qemu_arm/root_system$ dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
32+0 records in
32+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 0.31139 s, 108 MB/s
book@book-virtual-machine:/qemu_arm/root_system$ 

2. 格式化成ext3文件系统
book@book-virtual-machine:/qemu_arm/root_system$ mkfs.ext3 a9rootfs.ext3 
3.  将文件拷贝到镜像中
book@book-virtual-machine:/qemu_arm/root_system$ sudo mkdir tmpfs
book@book-virtual-machine:/qemu_arm/root_system$ sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
book@book-virtual-machine:/qemu_arm/root_system$ sudo cp -r rootfs/* tmpfs/
book@book-virtual-machine:/qemu_arm/root_system$ sudo umount tmpfs


9.用Qemu测试生成的根文件系统

qemu-system-arm -M vexpress-a9 -m 512M -kernel /qemu_arm/linux-kernel/linux-3.16.39/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd /qemu_arm/root_system/a9rootfs.ext3

显示一大堆信息,最后出现提示如下:
  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 43
input: ImExPS/2 Generic Explorer Mouse as /devices/mb:kmi1/serio1/input/input2
kjournald starting.  Commit interval 5 seconds
EXT3-fs (mmcblk0): mounted filesystem with writeback data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:0.
Freeing unused kernel memory: 244K (805d6000 - 80613000)
random: nonblocking pool is initialized
mount: mounting proc on /proc failed: No such file or directory


Processing /etc/profile... Done


/ # 

说明内核已启动并且挂接了文件系统,此时已可以使用busybox的命令集了.

遇到的问题:


make clean
make menuconfig
make 
make install 后生成的busybox不能用在ARM开发板中,因为没有修改过MAKEFILE文件所以就没有指定用交叉编译工具并且也不是arm的文件格式

可使用file busybox查看
book@book-virtual-machine:/qemu_arm/root_system/busybox-1.26.2/_install/bin$ file busybox 
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, stripped

注意红色字ARM,这才是用于arm开发板的busybox



根文件能挂接上,但不能运行,提示:
Kernel panic - not syncing: No working init found. 

使用file命令查看
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ file linuxrc 
linuxrc: symbolic link to bin/busybox
book@book-virtual-machine:/qemu_arm/root_system/rootfs$ file /bin/busybox 
/bin/busybox: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=3009223865ed1ed7bfab5468767d7cd504d6ef49, stripped

还有要注间的就是链接库的文件要拷全,不能只拷libm.so.6和[libc.so.6两个
另一个可能就在于上面提示的80386,可能在制作的过程中没有指定ARCH=arm造成的


参考文档:

http://blog.csdn.net/f413933206/article/details/6534685


0 0
原创粉丝点击