sbox2簡(jiǎn)介
scratchbox2(簡(jiǎn)稱(chēng)sbox2)是一個(gè)交叉編譯模擬器,可以模擬ARM、X86、MIPS等平臺(tái)。scratchbox2是scratchbox1的第二版。但是第二版完全舍棄的第一版,在使用上第二版比第一版方便、易用很多。
2009年4月,Scratchbox2正式發(fā)布,2010年3月,Nokia正式接手scratchbox2 的維護(hù)工作。Nokia接手Scratchbox2的目的很明顯,就是為Maemo手機(jī)平臺(tái)提供一個(gè)模擬的軟件開(kāi)發(fā)環(huán)境。
Scratchbox2的使用要配合qemu、交叉工具鏈和目標(biāo)平臺(tái)的根文件系統(tǒng)來(lái)使用。qemu是目標(biāo)平臺(tái)的CPU虛擬機(jī),如ARM的虛擬機(jī)是qemu-arm。交叉工具鏈可以是自己制作的,或者從CodeSourcery網(wǎng)站等下載的交叉編譯工具鏈。根文件系統(tǒng)是目標(biāo)平臺(tái)的根文件系統(tǒng)。
安裝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
準(zhǔn)備根文件系統(tǒng)
目標(biāo)平臺(tái)的根文件系統(tǒng)必須遵循FHS 根文件系統(tǒng)結(jié)構(gòu),根文件系統(tǒng)的必要內(nèi)容是在lib目錄下必須有C動(dòng)態(tài)庫(kù)。
如下,建立根文件系統(tǒng)和拷貝必要C庫(kù)。
$ 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作為目標(biāo)平臺(tái)的根目錄,并且拷貝了gcc-3.4.5-glibc-2.3.6工具鏈的C庫(kù)到這個(gè)根目錄下。
配置模擬環(huán)境
以上3步完成之后,下面就可以使用安裝的scratchbox2配置目標(biāo)平臺(tái)的模擬環(huán)境。配置模擬環(huán)境使用的是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虛擬機(jī);“ARM3.4.5”表示這次配置的模擬環(huán)境的名稱(chēng);“/opt/crosstool/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc ”表示在這個(gè)模擬環(huán)境中gcc對(duì)應(yīng)的程序是哪個(gè)。
第一次配置時(shí),會(huì)先下載安裝libtool,配置成功,出現(xiàn)下面的提升。
sb2-init completed successfully, have fun!
使用模擬器
模擬環(huán)境配置好后,就可以在任何地方使用sb2來(lái)編程程序,如要交叉編譯hello.c程序:
$ sudo sb2 gcc hello.c -o hello
查看編譯出來(lái)的hello程序信息,可以看到在sbox2模擬環(huán)境中,使用gcc編譯的程序是基于arm平臺(tái)的,如下:
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
可以在模擬環(huán)境中運(yùn)行程序:
$ sudo sb2 ./hello
hello farsight!
也可以完全進(jìn)入SB2的模擬環(huán)境中,進(jìn)行軟件的編譯:
$ sudo sb2 -t ARM3.4.5
“-t ARM3.4.5”表示使用哪個(gè)虛擬環(huán)境,對(duì)應(yīng)sb2-init配置時(shí)指定的虛擬環(huán)境名稱(chēng)。進(jìn)入模擬環(huán)境的界面如下:
[SB2 simple ARM3.4.5] root@dtop ~ $
這個(gè)環(huán)境就是目標(biāo)機(jī)的模擬環(huán)境,查看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
可以看到,在模擬環(huán)境中,gcc是交叉工具鏈的arm-linux-gcc。
綜述
在sbox2配置的模擬環(huán)境中編譯一些利用autotool發(fā)布的開(kāi)源軟件比普通的交叉編譯方法方便很多。如SDL、ffmpeg、vlc等軟件在這個(gè)模擬器下編譯,在配置時(shí)只需使用 “ –prefix ”選項(xiàng)指定安裝路徑就可以了。指定--prefix選項(xiàng)之后,make install時(shí)會(huì)把程序安裝到--prefix指定的目錄,此時(shí)用ldd來(lái)查看程序動(dòng)態(tài)鏈接庫(kù)依賴(lài)關(guān)系,會(huì)看到程序依賴(lài)本身動(dòng)態(tài)庫(kù)的路徑與--prefix指定有關(guān)。但是這并不是意味著程序運(yùn)行時(shí)一定只能到--prefix指定的目錄尋找該動(dòng)態(tài)庫(kù),實(shí)際上,會(huì)在LD_LIBRARY_PATH指定目錄、/lib和/usr/lib標(biāo)準(zhǔn)庫(kù)目錄、/etc/ld.conf中的目錄尋找動(dòng)態(tài)庫(kù)。所以把--prefix中的動(dòng)態(tài)庫(kù)移動(dòng)到/lib或/usr/lib中程序同樣能夠正常運(yùn)行。有了這種方式,交叉編譯時(shí)利用--prefix指定安裝目錄,不影響宿主機(jī),還可以把--prefix中的安裝庫(kù)文件直接拷貝到目標(biāo)機(jī)的/lib或/usr/lib中,程序正常運(yùn)行。
聯(lián)系客服