這篇文章主要講解了“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”吧!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),白河企業(yè)網(wǎng)站建設(shè),白河品牌網(wǎng)站建設(shè),網(wǎng)站定制,白河網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,白河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
我們是在一臺(tái)ubuntu14.04 64bit上的gcc485交叉編譯出如下tinycolinux 3.x 64的(不要直接用tinycolinux上32位的gcc編譯這個(gè)kernel):
參照《將tinycolinux以硬盤模式安裝到云主機(jī)》一文的相似做法,我們從http://mirrors.163.com/tinycorelinux/3.x/release/src/kernel/下載64位的src和patch,打開virtualization中的virtio pci選項(xiàng),編譯進(jìn)virtio block和network驅(qū)動(dòng),輕易在arch/x86/boot下得到bzimage,放到boot中啟動(dòng)。發(fā)現(xiàn)可以跟原有的rootfs一起正常啟動(dòng)。uname -m顯示x86_64。file /boot/bzimage,顯示x86 bootable kernel。猜這是因?yàn)樵?config文件中同時(shí)開啟了32和64支持,32位程序能運(yùn)行在64位上,且原來的rootfs中的32位binutils和gcc未變。
如果把64位某linux的程序拷進(jìn)來file它顯示64bit elf,執(zhí)行它會(huì)提示not found,這是因?yàn)樗蕾嚨腷inutils ld沒有,調(diào)用gcc -o helloworld.c -64m,提示unimplemented,這是因?yàn)?.x的rootfs是沒有對(duì)應(yīng)的GCC 64的。接下來需要cross compile一個(gè):
一般地,GCC支持從高向低crosscompile,反過來要難一點(diǎn)。所以這里我們采取最簡(jiǎn)單的方法:從同版本的32位GCC bootstrap編譯出同版本的GCC,采用本地的32位gcc bootstrap式cross compile出64位的gcc,不再使用外來cross compile的方案(直接那樣也行)。當(dāng)然這種方案是設(shè)想了tinycolinux上本來就存在GCC的事實(shí)基礎(chǔ)上,如果追求更通用的實(shí)踐目的,還是從外面的系統(tǒng)cross compile進(jìn)來好。
這樣產(chǎn)生出來的GCC僅是一個(gè)target到x86_64-pc-linux-gnu的gcc 443版本,因?yàn)樵诒緳C(jī)上構(gòu)建,所以這個(gè)build和host都不變,為本機(jī)系統(tǒng)HOST,但是并不影響我們的工作繼續(xù),至于以后你要用這個(gè)GCC作雞生蛋蛋生雞的事,比如可以用這個(gè)再次自舉GCC443到host也為443的版本inplace覆蓋,這都是以后的事。GCC支持從32到64或反過來的交叉構(gòu)建。
我們選用2.x repos的make.tcz(3.81版,為什么不使用3.x的make 382接下來會(huì)涉及到)和選用3.x repos的gcc443 32位(為什么不用4.x的gcc471:因?yàn)?.x后采用eglibc,在編譯很多程序時(shí)會(huì)遇到重復(fù)定義錯(cuò)誤,這個(gè)時(shí)候就應(yīng)該想到是版本問題),走從GCC443 32位編譯出GCC443 64的方案,要保證系統(tǒng)絕對(duì)干凈,否則可能會(huì)遇到各種坑(比如cant computer object file prefix,etc..),介紹一下制作純凈tinycolinux系統(tǒng)的方法:
按《在硬盤上安裝tinycolinux》的方法重新安裝rootfs,相當(dāng)于重裝系統(tǒng),除了保留第一步的64 bzimage在boot下引導(dǎo)不變,你可能需要額外安裝openssh。然后下載3.x的toolchain并安裝:
sudo unsquashfs -f -d / /tce/gccbase/gmp.tcz sudo unsquashfs -f -d / /tce/gccbase/libmpc.tcz sudo unsquashfs -f -d / /tce/gccbase/mpfr.tcz sudo unsquashfs -f -d / /tce/gccbase/ppl.tcz sudo unsquashfs -f -d / /tce/gccbase/cloog.tcz sudo unsquashfs -f -d / /tce/gccbase/binutils.tcz sudo unsquashfs -f -d / /tce/gccbase/bison.tcz sudo unsquashfs -f -d / /tce/gccbase/diffutils.tcz sudo unsquashfs -f -d / /tce/gccbase/file.tcz sudo unsquashfs -f -d / /tce/gccbase/findutils.tcz sudo unsquashfs -f -d / /tce/gccbase/flex.tcz sudo unsquashfs -f -d / /tce/gccbase/gawk.tcz sudo unsquashfs -f -d / /tce/gccbase/gcc.tcz sudo unsquashfs -f -d / /tce/gccbase/grep.tcz sudo unsquashfs -f -d / /tce/gccbase/m4.tcz sudo unsquashfs -f -d / /tce/gccbase/make.tcz sudo unsquashfs -f -d / /tce/gccbase/patch.tcz sudo unsquashfs -f -d / /tce/gccbase/pkg-config.tcz sudo unsquashfs -f -d / /tce/gccbase/sed.tcz sudo unsquashfs -f -d / /tce/gccbase/base-dev.tcz #sudo unsquashfs -f -d / /tce/gccbase/gcc_libs.tcz #sudo unsquashfs -f -d / /tce/gccbase/linux-headers-2.6.33.3-tinycore.tcz
然后下載以下并準(zhǔn)備,都解壓到一個(gè)目錄。
http://mirrors.163.com/tinycorelinux/3.x/release/src/compiletc_other/ (mpfr-2.4.2.tar.xz,gmp-4.3.2.tar.xz,binutils-2.20.tar.xz)
http://mirrors.163.com/tinycorelinux/3.x/release/src/glibc-2.11.1.tar.bz2 (不用2.11.1了,到ftp.glibc.gnu.com下載2.12.1,以后有用)
http://mirrors.163.com/tinycorelinux/3.x/release/src/gcc-4.4.3.tar.bz2(從GCC-4.3起,安裝GCC將依賴于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果將這兩個(gè)軟件包分別解壓到GCC源碼樹的根目錄下,并分別命名為"gmp"和"mpfr" )
1)首先編譯binutils:
cd binutils-2.20 && sudo make b && cd b sudo ../configure --prefix=/usr/local/gcc443 --target=x86_64-pc-linux-gnu --disable-multilib
高版本GCC可加--disable-werror以免導(dǎo)致各種警告錯(cuò)誤
sudo make sudo make install
2)然后導(dǎo)出linux頭文件到工具鏈:
cd linux-2.6.33.3 sudo make ARCH=x86_64 INSTALL_HDR_PATH=/usr/local/gcc443/x86_64-pc-linux-gnu headers_install
要用到perl.tcz
構(gòu)建GCC工具框架,不帶任何庫。
cd gcc-4.4.3 && sudo make b && cd b sudo ../configure --prefix=/usr/local/gcc443 --target=x86_64-pc-linux-gnu --enable-languages=c,c++ --disable-multilib
如果使用的3.x的make 3.8.2會(huì)出現(xiàn)configure錯(cuò)誤:mixed rule
sudo make all-gcc sudo make install-gcc
生成glibc的基礎(chǔ)部分
第三步已經(jīng)將工具生成了,現(xiàn)在最重要的基礎(chǔ)庫的基礎(chǔ)部分,注意還不是整個(gè)glibc
預(yù)先export PATH=$PATH:/usr/local/gcc443/bin幫助接下來的configure找到新編譯出的x86_64-pc-linux-gnu-gcc,雖然configure會(huì)自動(dòng)找到,手動(dòng)一下更保險(xiǎn)
cd glibc-2.12.1 && sudo make b && cd b sudo ../configure --prefix=/usr/local/gcc443/x86_64-pc-linux-gnu --build=$MACHTYPE --host=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu --with-headers=/usr/local/gcc443/x86_64-pc-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
$MACHTYPE在正常的linux32上會(huì)輸出i686-pc-linux-gnu字樣,在tinycolinux上輸出為空,繼續(xù)
如上語句在tinycolinux上一次通過,但在普通linux上configure似首很容易把glibc源碼目錄被破壞,即使是cd 到b中,比如你也許會(huì)碰到:cannot compute suffix of object files或者: invalid host type: $CXX unregconnize -c,并不網(wǎng)上說的解決辦法能解決的,往往重新準(zhǔn)備glibc源碼目錄重新按上面的configure來配置就好了,在普通linux上,glibc源碼目錄下的scripts/gen-sorted.awk 19行以后會(huì)出現(xiàn)需要將/[^/]+$ 改成 /[^/]+$的BUG,修正就好了。
然后就是make了:
a) sudo make install-bootstrap-headers=yes install-headers
在tinycolinux上一次通過,在普通linux上,你或許需要在make后額外加CFLAGS="-O2 -U_FORTIFY_SOURCE" cross-compiling=yes以分別應(yīng)付下列可能出現(xiàn)的錯(cuò)誤。
cross-compiling=yes : No rule to make target `elf/soinit.os' error CFLAGS=02 : glibc cant continues without opt error -U_FORTIFY_SOURCE : inlining failed in call to ‘syslog’ error
如果在不純凈的tinycolinux上執(zhí)行a),可能會(huì)出現(xiàn)需要tls support error
b) sudo make csu/subdir_lib
如果在不純凈的tinycolinux上執(zhí)行b),會(huì)繼續(xù)出錯(cuò)
c) install csu/crt1.o csu/crti.o csu/crtn.o /usr/local/gcc443/x86_64-pc-linux-gnu/lib
d) x86_64-pc-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /usr/local/gcc443/x86_64-pc-linux-gnu/lib/libc.so
e) touch /usr/local/gcc443/x86_64-pc-linux-gnu/include/gnu/stubs.h
如果在純凈的tinycolinux上,可以無誤一直執(zhí)行到e),一般到這接下來二步都能完成。
5)生成GCC的LIBGCC
重新cd gcc-4.4.3/b sudo make all-target-libgcc sudo make install-target-libgcc
6)最后一步,生成完整的glibc和gcc中的stdc++lib
重新cd glibc-2.12.1/b sudo make sudo make install
重新cd gcc-4.4.3/b sudo make sudo make install
其實(shí)如上三部曲的編譯還有很多聯(lián)合構(gòu)建的選項(xiàng)。但是本文不深究了。
先寫一個(gè)CPP的helloworld,test.cpp
#includeint main() { printf("Hello World"); return 0; }
然后分別/usr/local/gcc443/bin/x86_64-pc-linux-gnu-g++ test.cpp -o a,/usr/local/gcc443/bin/x86_64-pc-linux-gnu-g++ -static test.cpp -o b,file a,file b,發(fā)現(xiàn)都是64位程序,我們發(fā)現(xiàn)b可以直接運(yùn)行,而a顯示not found,跟文章開頭說的沒有64位的GCC和binutils一樣原因,那么現(xiàn),我們討求用新編譯出的工具鏈讓它運(yùn)行的方法:
其實(shí)原因就是找不到共享庫,error cant find share libs, ELF64CLASS,我們不能用32位的LDD分析它的依賴關(guān)系,但我們可以cd a所在的目錄,x86_64-pc-linux-gnu-readelf -a ./a | grep "Shared"或x86_64-pc-linux-gnu-objdump -p ./a | grep NEEDED的方式查看,發(fā)現(xiàn)它引用了libc.so.6(->libc-2.12.1.so),libstdc++.so.6(->libstdc++.so.6.0.13),libgcc_s.so.1,libm.so.6(->libm-2.12.1.so),當(dāng)然了,這些庫都要從新編譯出的工具鏈的lib或lib64中找,放到a的目錄,然后在a的目錄下寫個(gè)runa,加起執(zhí)行權(quán)限,內(nèi)容為:
D=$(dirname $0) $D/ld-linux-x86-64.so.2 --library-path $D:$D/lib:$D/usr/lib ./a $@ (ld-linux-x86-64.so.2也是從工具鏈中找到的,它其實(shí)可以被執(zhí)行,你也可以定制上面的--library-path)
執(zhí)行./runa,輸出跟靜態(tài)b一樣的結(jié)果。
這從理論上說明,只要系統(tǒng)支持默認(rèn)的ld-linux-x86-64,它就支持運(yùn)行一切由這個(gè)新工具鏈產(chǎn)生的程序。
現(xiàn)在,64位的kernel有了,生成64位程序的toolchain有了(它本身還是32位程序只是也能處理64位生成的事),但是整個(gè)ROOTFS還是基本上32上的,連運(yùn)行它生成的64位程序的事都管不了,應(yīng)該要重新編譯busybox讓它支持新的64位ld。
還有,可以以這個(gè)TOOLCHAIN為基礎(chǔ),不斷bootstrap高版本的GCC,或者inplace覆蓋,或變動(dòng)BUILD,HOST進(jìn)行,產(chǎn)生新的toolchains.
感謝各位的閱讀,以上就是“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!