溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain

發(fā)布時(shí)間:2021-07-27 16:07:09 來(lái)源:億速云 閱讀:185 作者:chen 欄目:大數(shù)據(jù)

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

cross compile tinycolinux3.x 64

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

參照《將tinycolinux以硬盤(pán)模式安裝到云主機(jī)》一文的相似做法,我們從http://mirrors.163.com/tinycorelinux/3.x/release/src/kernel/下載64位的src和patch,打開(kāi)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í)開(kāi)啟了32和64支持,32位程序能運(yùn)行在64位上,且原來(lái)的rootfs中的32位binutils和gcc未變。

如果把64位某linux的程序拷進(jìn)來(lái)file它顯示64bit elf,執(zhí)行它會(huì)提示not found,這是因?yàn)樗蕾?lài)的binutils ld沒(méi)有,調(diào)用gcc -o helloworld.c -64m,提示unimplemented,這是因?yàn)?.x的rootfs是沒(méi)有對(duì)應(yīng)的GCC 64的。接下來(lái)需要cross compile一個(gè):

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

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

這樣產(chǎn)生出來(lái)的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或反過(guò)來(lái)的交叉構(gòu)建。

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

按《在硬盤(pán)上安裝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將依賴(lài)于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果將這兩個(gè)軟件包分別解壓到GCC源碼樹(shù)的根目錄下,并分別命名為"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

  1. 構(gòu)建GCC工具框架,不帶任何庫(kù)。

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

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

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

預(yù)先export PATH=$PATH:/usr/local/gcc443/bin幫助接下來(lái)的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ù)

如上語(yǔ)句在tinycolinux上一次通過(guò),但在普通linux上configure似首很容易把glibc源碼目錄被破壞,即使是cd 到b中,比如你也許會(huì)碰到:cannot compute suffix of object files或者: invalid host type: $CXX unregconnize -c,并不網(wǎng)上說(shuō)的解決辦法能解決的,往往重新準(zhǔn)備glibc源碼目錄重新按上面的configure來(lái)配置就好了,在普通linux上,glibc源碼目錄下的scripts/gen-sorted.awk 19行以后會(huì)出現(xiàn)需要將/[^/]+$ 改成 /[^/]+$的BUG,修正就好了。

然后就是make了:

a) sudo make install-bootstrap-headers=yes install-headers

在tinycolinux上一次通過(guò),在普通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上,可以無(wú)誤一直執(zhí)行到e),一般到這接下來(lái)二步都能完成。

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)。但是本文不深究了。

測(cè)試編譯64位程序并運(yùn)行

先寫(xiě)一個(gè)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可以直接運(yùn)行,而a顯示not found,跟文章開(kāi)頭說(shuō)的沒(méi)有64位的GCC和binutils一樣原因,那么現(xiàn),我們討求用新編譯出的工具鏈讓它運(yùn)行的方法:

其實(shí)原因就是找不到共享庫(kù),error cant find share libs, ELF64CLASS,我們不能用32位的LDD分析它的依賴(lài)關(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)然了,這些庫(kù)都要從新編譯出的工具鏈的lib或lib64中找,放到a的目錄,然后在a的目錄下寫(xiě)個(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é)果。

這從理論上說(shuō)明,只要系統(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)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何在tinycolinux32上安裝tinycolinux64 kernel和toolchain這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI