前面介绍了用Buildroot来制作交叉编译工具链,本文将介绍如何用播放机进行本机编译(Native Compiling)。所谓本机编译,是相对于交叉编译(Cross Compiling)而言的。其实这是最常见的编译方式,即在本机编译程序用于在本机或与本机兼容的硬件平台上运行。
一般嵌入式系统的CPU计算性能较差,内存也不多,本机编译要比在PC上交叉编译花更长的时间。但是并非所有软件都支持交叉编译,如mldonkey,这时就只能用本机编译了。
首先要制作本机编译工具链。我们知道用Buildroot可以生成包含本机编译工具的根文件系统,只须在配置Buildroot时请选择下面两个选项:
- development files in target filesystem
- native toolchain in the target filesystem
make完成后生成的根文件系统在output/target目录下,将它打包:
$ cd output/target
$ tar jcf /tmp/mipsel-native-toolchain-gcc442-uc0928-rootfs.tar.bz2 .
这是我制作的一个根文件系统:
mipsel-native-toolchain-gcc442-uc0928-rootfs.tar.bz2 (如果不能下载请尝试
此链接)
然后在播放机上进入以此文件系统为根的
chroot环境,就得到一个本机编译环境。具体步骤如下:
1. 准备一个ext3文件系统的移动硬盘。不能用ntfs或fat,因为它们不支持符号链接(symoblic link)。
2. 将制作好的根文件系统解压到移动硬盘上的toolchain-root目录下(此步骤可在PC或播放机上完成)
# cd <移动硬盘挂载点>
# mkdir toolchain-root
# cd toolchain-root
# tar jxf /path/to/mipsel-native-toolchain-gcc442-uc0928-rootfs.tar.bz2
以下步骤在播放机上完成。假设移动硬盘的挂载点是/tmp/usbmounts/sda1
3. 为toolchain-root绑定或挂载/proc,/sys,/dev,/tmp等伪文件系统。这将为给chroot提供更加逼真的根文件系统,使得大部分命令都能正常执行。
# mount --bind /proc /tmp/usbmounts/sda1/toolchain-root/proc
# mount --bind /sys /tmp/usbmounts/sda1/toolchain-root/sys
# mount --bind /dev /tmp/usbmounts/sda1/toolchain-root/dev
# mount -t tmpfs tmpfs /tmp/usbmounts/sda1/toolchain-root/tmp
4. 进入chroot环境并执行shell
# chroot /tmp/usbmounts/sda1/toolchain-root /bin/sh
BusyBox v1.15.3 (2010-04-08 22:24:27 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
#
至此我们就得到一个本机编译环境,此时的根目录就是原移动硬盘根录下的toolchain-root目录,在此环境下的所有文件系统访问都将被局限于此目录下。
# pwd
/
# ls -l
drwxr-xr-x 2 root root 4096 Apr 8 15:12 bin
drwxr-xr-x 11 root root 2840 Oct 3 06:36 dev
drwxr-xr-x 6 root root 4096 Sep 28 15:46 etc
drwxr-xr-x 2 root root 4096 Apr 8 13:51 home
drwxr-xr-x 2 root root 4096 Apr 8 15:12 lib
lrwxrwxrwx 1 root root 11 Sep 28 15:09 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 Apr 8 13:51 mnt
drwxr-xr-x 2 root root 4096 Apr 8 13:51 opt
dr-xr-xr-x 45 root root 0 Oct 3 06:36 proc
drwxr-xr-x 2 root root 4096 Oct 3 06:38 root
drwxr-xr-x 2 root root 4096 Apr 8 15:12 sbin
drwxr-xr-x 10 root root 0 Oct 3 06:36 sys
drwxrwxrwt 2 root root 40 Oct 3 06:37 tmp
drwxr-xr-x 9 root root 4096 Apr 8 15:11 usr
drwxr-xr-x 3 root root 4096 Dec 1 2009 var
# which gcc
/usr/bin/gcc
# gcc --version
gcc (GCC) 4.4.2
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
建议在toolchain-root下建一个build目录用作编译工作目录。把要编译的软件源码放到toolchain-root/build目录下,在chroot环境下就在/build目录下。
如果你忘记了自己现在是不是在chroot环境下,有一个很简单的方法可以区分:如果存在/tmp/usbmounts/sda1/toolchain-root目录则不是,否则就是。toolchain-root就好比《盗梦空间》里的哪个陀螺。
注意事项:
1.在播放机上进行编译前最好先执行stopall停止DvdPlayer以释放其占用的内存。
2.建议在硬盘上建一个交换文件以弥补内存的不足。
参考:
1.
交叉编译(Cross Compiling)2.
Buildroot - 让交叉编译更轻松