作者:谭石坚,华清远见嵌入式学院 高级讲师
sbox2简介
scratchbox2(简称sbox2)是一个交叉编译模拟器,可以模拟ARM、X86、MIPS等平台。scratchbox2是scratchbox1的第二版。但是第二版完全舍弃的第一版,在使用上第二版比第一版方便、易用很多。
2009年4月,Scratchbox2正式发布,2010年3月,Nokia正式接手scratchbox2 的维护工作。Nokia接手Scratchbox2的目的很明显,就是为Maemo手机平台提供一个模拟的软件开发环境。
Scratchbox2的使用要配合qemu、交叉工具链和目标平台的根文件系统来使用。qemu是目标平台的CPU虚拟机,如ARM的虚拟机是qemu-arm。交叉工具链可以是自己制作的,或者从CodeSourcery网站等下载的交叉编译工具链。根文件系统是目标平台的根文件系统。
安装scratchbox2和qemu
在ubuntu10.04下可以使用apt-get install安装scratchbox2和qemu-arm。其中qemu-arm包含在qemu-kvm-extras中,安装如下:
$ sudo apt-get install scratchbox2 qemu-kvm-extras
安装交叉编译工具链
这里我们使用的是用crosstool制作的gcc-3.4.5-glib-2.3.6的交叉工具链,工具链安装在/opt/crosstool/目录下,如:
$ ls /opt/crosstool/gcc-3.4.5-glibc-2.3.6/
arm-linux bin include lib man
arm-linux.crosstoolconfig.txt distributed info libexec tmp
准备根文件系统
目标平台的根文件系统必须遵循FHS 根文件系统结构,根文件系统的必要内容是在lib目录下必须有C动态库。
如下,建立根文件系统和拷贝必要C库。
$ cd /opt
$ mkdir myrootfs
$ cd myrootfs/
$ mkdir bin dev etc lib sbin usr tmp proc sys
$ cp -a /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/* lib/
这里以/opt/myrootfs作为目标平台的根目录,并且拷贝了gcc-3.4.5-glibc-2.3.6工具链的C库到这个根目录下。
配置模拟环境
以上3步完成之后,下面就可以使用安装的scratchbox2配置目标平台的模拟环境。配置模拟环境使用的是sb2-init工具,如下:
$ sudo sb2-init -c qemu-arm ARM3.4.5 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc
其中,“-c qemu-arm ”表示使用qemu-arm虚拟机;“ARM3.4.5”表示这次配置的模拟环境的名称;“/opt/crosstool/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc ”表示在这个模拟环境中gcc对应的程序是哪个。
第一次配置时,会先下载安装libtool,配置成功,出现下面的提升。
sb2-init completed successfully, have fun!
使用模拟器
模拟环境配置好后,就可以在任何地方使用sb2来编程程序,如要交叉编译hello.c程序:
$ sudo sb2 gcc hello.c -o hello
查看编译出来的hello程序信息,可以看到在sbox2模拟环境中,使用gcc编译的程序是基于arm平台的,如下:
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
可以在模拟环境中运行程序:
$ sudo sb2 ./hello
hello farsight!
也可以完全进入SB2的模拟环境中,进行软件的编译:
$ sudo sb2 -t ARM3.4.5
“-t ARM3.4.5”表示使用哪个虚拟环境,对应sb2-init配置时指定的虚拟环境名称。进入模拟环境的界面如下:
[SB2 simple ARM3.4.5] root@dtop ~ $
这个环境就是目标机的模拟环境,查看gcc版本信息:
[SB2 simple ARM3.4.5] root@dtop ~ $ gcc -v
Reading specs from /opt/crosstool/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/specs
Reading specs from /usr/share/scratchbox2/../../share/scratchbox2/modeconf/gcc-specs.simple
rename spec cpp to old_cpp
Configured with: /work/tools/create_crosstools/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-
2.3.6/gcc-3.4.5/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/work/
tools/gcc-3.4.5-glibc-2.3.6 --with-float=soft --with-headers=/work/tools/gcc-3.4.5-glibc-2.3.6/
arm-linux/include --with-local-prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.5
可以看到,在模拟环境中,gcc是交叉工具链的arm-linux-gcc。
综述
在sbox2配置的模拟环境中编译一些利用autotool发布的开源软件比普通的交叉编译方法方便很多。如SDL、ffmpeg、vlc等软件在这个模拟器下编译,在配置时只需使用 “ –prefix ”选项指定安装路径就可以了。