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 ”选项指定安装路径就可以了。指定--prefix选项之后,make install时会把程序安装到--prefix指定的目录,此时用ldd来查看程序动态链接库依赖关系,会看到程序依赖本身动态库的路径与--prefix指定有关。但是这并不是意味着程序运行时一定只能到--prefix指定的目录寻找该动态库,实际上,会在LD_LIBRARY_PATH指定目录、/lib和/usr/lib标准库目录、/etc/ld.conf中的目录寻找动态库。所以把--prefix中的动态库移动到/lib或/usr/lib中程序同样能够正常运行。有了这种方式,交叉编译时利用--prefix指定安装目录,不影响宿主机,还可以把--prefix中的安装库文件直接拷贝到目标机的/lib或/usr/lib中,程序正常运行。 |
|