如何在tinycolinux32上安裝tinycolinux64kernel和toolchain

這篇文章主要講解了“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”吧!

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),白河企業(yè)網(wǎng)站建設(shè),白河品牌網(wǎng)站建設(shè),網(wǎng)站定制,白河網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,白河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

cross compile tinycolinux3.x 64

我們是在一臺ubuntu14.04 64bit上的gcc485交叉編譯出如下tinycolinux 3.x 64的(不要直接用tinycolinux上32位的gcc編譯這個kernel):

參照《將tinycolinux以硬盤模式安裝到云主機》一文的相似做法,我們從http://mirrors.163.com/tinycorelinux/3.x/release/src/kernel/下載64位的src和patch,打開virtualization中的virtio pci選項,編譯進virtio block和network驅(qū)動,輕易在arch/x86/boot下得到bzimage,放到boot中啟動。發(fā)現(xiàn)可以跟原有的rootfs一起正常啟動。uname -m顯示x86_64。file /boot/bzimage,顯示x86 bootable kernel。猜這是因為在.config文件中同時開啟了32和64支持,32位程序能運行在64位上,且原來的rootfs中的32位binutils和gcc未變。

如果把64位某linux的程序拷進來file它顯示64bit elf,執(zhí)行它會提示not found,這是因為它依賴的binutils ld沒有,調(diào)用gcc -o helloworld.c -64m,提示unimplemented,這是因為3.x的rootfs是沒有對應(yīng)的GCC 64的。接下來需要cross compile一個:

在32 tinycolinux上boostrap compile gcc 4.4.3 64 三件套 for tinycolinux 3.x 64 target

一般地,GCC支持從高向低crosscompile,反過來要難一點。所以這里我們采取最簡單的方法:從同版本的32位GCC bootstrap編譯出同版本的GCC,采用本地的32位gcc bootstrap式cross compile出64位的gcc,不再使用外來cross compile的方案(直接那樣也行)。當然這種方案是設(shè)想了tinycolinux上本來就存在GCC的事實基礎(chǔ)上,如果追求更通用的實踐目的,還是從外面的系統(tǒng)cross compile進來好。

這樣產(chǎn)生出來的GCC僅是一個target到x86_64-pc-linux-gnu的gcc 443版本,因為在本機上構(gòu)建,所以這個build和host都不變,為本機系統(tǒng)HOST,但是并不影響我們的工作繼續(xù),至于以后你要用這個GCC作雞生蛋蛋生雞的事,比如可以用這個再次自舉GCC443到host也為443的版本inplace覆蓋,這都是以后的事。GCC支持從32到64或反過來的交叉構(gòu)建。

我們選用2.x repos的make.tcz(3.81版,為什么不使用3.x的make 382接下來會涉及到)和選用3.x repos的gcc443 32位(為什么不用4.x的gcc471:因為4.x后采用eglibc,在編譯很多程序時會遇到重復(fù)定義錯誤,這個時候就應(yīng)該想到是版本問題),走從GCC443 32位編譯出GCC443 64的方案,要保證系統(tǒng)絕對干凈,否則可能會遇到各種坑(比如cant computer object file prefix,etc..),介紹一下制作純凈tinycolinux系統(tǒng)的方法:

按《在硬盤上安裝tinycolinux》的方法重新安裝rootfs,相當于重裝系統(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

然后下載以下并準備,都解壓到一個目錄。

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以上版本。如果將這兩個軟件包分別解壓到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)致各種警告錯誤

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

  1. 構(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會出現(xiàn)configure錯誤:mixed rule

sudo make all-gcc sudo make install-gcc

  1. 生成glibc的基礎(chǔ)部分

第三步已經(jīng)將工具生成了,現(xiàn)在最重要的基礎(chǔ)庫的基礎(chǔ)部分,注意還不是整個glibc

預(yù)先export PATH=$PATH:/usr/local/gcc443/bin幫助接下來的configure找到新編譯出的x86_64-pc-linux-gnu-gcc,雖然configure會自動找到,手動一下更保險

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上會輸出i686-pc-linux-gnu字樣,在tinycolinux上輸出為空,繼續(xù)

如上語句在tinycolinux上一次通過,但在普通linux上configure似首很容易把glibc源碼目錄被破壞,即使是cd 到b中,比如你也許會碰到:cannot compute suffix of object files或者: invalid host type: $CXX unregconnize -c,并不網(wǎng)上說的解決辦法能解決的,往往重新準備glibc源碼目錄重新按上面的configure來配置就好了,在普通linux上,glibc源碼目錄下的scripts/gen-sorted.awk 19行以后會出現(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)的錯誤。

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),可能會出現(xiàn)需要tls support error

b) sudo make csu/subdir_lib

如果在不純凈的tinycolinux上執(zhí)行b),會繼續(xù)出錯

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

其實如上三部曲的編譯還有很多聯(lián)合構(gòu)建的選項。但是本文不深究了。

測試編譯64位程序并運行

先寫一個CPP的helloworld,test.cpp

#include <stdio.h>
int 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可以直接運行,而a顯示not found,跟文章開頭說的沒有64位的GCC和binutils一樣原因,那么現(xiàn),我們討求用新編譯出的工具鏈讓它運行的方法:

其實原因就是找不到共享庫,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),當然了,這些庫都要從新編譯出的工具鏈的lib或lib64中找,放到a的目錄,然后在a的目錄下寫個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也是從工具鏈中找到的,它其實可以被執(zhí)行,你也可以定制上面的--library-path)

執(zhí)行./runa,輸出跟靜態(tài)b一樣的結(jié)果。

這從理論上說明,只要系統(tǒng)支持默認的ld-linux-x86-64,它就支持運行一切由這個新工具鏈產(chǎn)生的程序。


現(xiàn)在,64位的kernel有了,生成64位程序的toolchain有了(它本身還是32位程序只是也能處理64位生成的事),但是整個ROOTFS還是基本上32上的,連運行它生成的64位程序的事都管不了,應(yīng)該要重新編譯busybox讓它支持新的64位ld。

還有,可以以這個TOOLCHAIN為基礎(chǔ),不斷bootstrap高版本的GCC,或者inplace覆蓋,或變動BUILD,HOST進行,產(chǎn)生新的toolchains.

感謝各位的閱讀,以上就是“如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

當前文章:如何在tinycolinux32上安裝tinycolinux64kernel和toolchain
網(wǎng)站網(wǎng)址:http://muchs.cn/article14/johige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、網(wǎng)站維護ChatGPT、網(wǎng)站設(shè)計、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營