久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Magic Linux開發(fā)入門指南(一) | Magic Linux 開發(fā)總部

 紫火神兵 2015-03-06

制作一個(gè)Linux發(fā)布難嗎,?

很難。

制作一個(gè)Linux發(fā)布版需要很高深的技術(shù)嗎,?

你能行,。


好多人很想?yún)⑴cMagic Linux的開發(fā),但多數(shù)不知從何入手,。
其實(shí)很簡單,,你只需要一臺供你支配的386以上配置且能夠上網(wǎng)的電腦,

以及一個(gè)能夠工作在其上的gcc環(huán)境,。

對,,這就夠了,其他的軟件都是在幫助你更快的,、更簡便的完成這個(gè)工

作,。因?yàn)長inux源自于網(wǎng)絡(luò),發(fā)展于網(wǎng)絡(luò),,能夠上網(wǎng)才能得到Linux,;Linux

自身及在其之上運(yùn)行的大多數(shù)軟件都是以源代碼方式提供,且非gcc不能完成

內(nèi)核的編譯,。擁有了這些,,你就可以開始將這些源代碼轉(zhuǎn)化為可運(yùn)行的內(nèi)核、

Shell和一些應(yīng)用軟件,,一點(diǎn)一點(diǎn)的就構(gòu)成了一個(gè)完整的可用的Linux系統(tǒng),。

本文就是講述如何開始這些工作的。我會(huì)假定你對Linux有一定的了解,,

使用過如:cp,、mv、rm等常用命令,,曾經(jīng)成功的在某個(gè)Linux系統(tǒng)中安裝過某個(gè)

以源代碼形式發(fā)布的軟件,,有一些C/C++或其他語言的經(jīng)驗(yàn)。

另外,,我說提到的gcc環(huán)境并不是單指gcc本身,,而是一些了與gcc相交織

的軟件集合,它們共同工作,完成從源代碼到可執(zhí)行程序的轉(zhuǎn)換過程,,這個(gè)過

程一般被稱之為創(chuàng)建,。


第一章 工具鏈的制作


在正式開始前,我還要讓你了解一個(gè)重要的知識,,那就是編譯器,、連接器

和程序庫他們?nèi)咧g的關(guān)系,如果你已經(jīng)非常了解了,,可以略過這些內(nèi)容,。

編譯器只是將源代碼翻譯成對應(yīng)的機(jī)器代碼,但是這個(gè)時(shí)候這些代碼是不能執(zhí)

行的,,因?yàn)榧葲]有排列好執(zhí)行順序也沒有指定從哪里開始,;程序庫實(shí)現(xiàn)了一些

程序必要的行為,比如你要輸出一些內(nèi)容到屏幕或從鍵盤獲得輸入等,;連接器

將編譯器產(chǎn)生的機(jī)器代碼進(jìn)行排序并告訴計(jì)算機(jī)(嚴(yán)格來講是操作系統(tǒng))從什么

地方開始執(zhí)行,,當(dāng)程序需要輸出一些內(nèi)容到屏幕或從鍵盤獲得輸入時(shí),請求程

序庫完成這些事情,。雖然這些說法顯得很不專業(yè),,但是足以幫助你理解它們?nèi)?br>
者之間的關(guān)系了。如果要獲得更為專業(yè),、詳細(xì)的知識請閱讀相關(guān)專業(yè)書籍,。

一個(gè)能夠正常工作的gcc環(huán)境,需要三個(gè)源代碼包的支持:binutils,、

gcc和glibc,,它們分別提供了連接器、編譯器和程序庫,。其實(shí)他們并不僅僅提

供了這些內(nèi)容:

binutils是一個(gè)二進(jìn)制工具集合,,包含了匯編器、反匯編器,、連接器、

elf可執(zhí)行文件分析器等重要工具,,這些工具在進(jìn)行Linux各種應(yīng)用的開發(fā)時(shí),,

發(fā)揮著巨大的作用。你可以在/usr/bin目錄中找到他們,。

gcc是一個(gè)編譯器集合,,包含了C、C++,、Objective-C,、Fortran、Java

和Ada語言,同時(shí)為這些語言提供了一些標(biāo)準(zhǔn)庫,,如:libstdc++,、libgcj,

……,。 gcc的C是Linux的標(biāo)準(zhǔn)編譯器,,linux內(nèi)核完全依賴于gcc,其他編譯

器不能編譯linux內(nèi)核,。由于ABI(Application Binary Interface)的不兼

容,,其他編譯器也不適合Linux上的大多數(shù)軟件的編譯,尤其那些使用C++作為

開發(fā)語言的軟件系統(tǒng),。目前Intel C/C++編譯器開始兼容gcc的ABI,,因此現(xiàn)在

可以采用Intel C/C++編譯器創(chuàng)建Linux上使用C/C++開發(fā)的軟件系統(tǒng),但內(nèi)核

不行,。gcc被安裝在/usr/bin,、/usr/lib和/usr/include目錄中。

glibc是提供系統(tǒng)調(diào)用和基本函數(shù)的C庫,,比如open,,malloc,printf等

等,,所有動(dòng)態(tài)連接的程序都要用到它,。它是用戶程序與內(nèi)核交流的標(biāo)準(zhǔn)接口。

這三個(gè)包在一起相互作用,,來完成Linux的所有創(chuàng)建任務(wù),。除了glibc是自

包含(自己依賴于自己)的外,其他兩個(gè)都要依賴于glibc,,同時(shí)glibc會(huì)與具體

的內(nèi)核版本有一定的依賴性,,但這并不是絕對的。注意,,他們都是用gcc編譯,,

并用binutils的連接器進(jìn)行連接的。這里就比較有趣了,,是先有雞還是先有蛋

呢,?計(jì)算機(jī)的發(fā)展史咱們就不必討論了,在本章會(huì)詳細(xì)介紹如何來讓他們的代碼

執(zhí)行起來,。但他們不是我們要的全部,。


首先,你應(yīng)該保證你有可用的gcc環(huán)境,,能夠用它讓你的源代碼變成可執(zhí)行

程序,。往往這需要你的計(jì)算機(jī)運(yùn)行了某個(gè)版本的Linux發(fā)布,。當(dāng)然Windows也行,

不過會(huì)比較麻煩,,我不建議你這么做,,我也不會(huì)在這里討論該怎么做。你也不要

指望你現(xiàn)在的這個(gè)gcc環(huán)境可以直接創(chuàng)建Magic Linux的所有,,最后你得到的還

是屬于你現(xiàn)在使用的這個(gè)發(fā)布,。因?yàn)槟悻F(xiàn)在的gcc創(chuàng)建產(chǎn)生后的程序,還是依賴

于你現(xiàn)有Linux發(fā)布版的glibc的,。如果你說你現(xiàn)在就創(chuàng)建一個(gè)glibc不就行了

嗎,?不信你可以試試,當(dāng)你安裝完后,,看看你的系統(tǒng)還能工作不,?言歸正傳,你

現(xiàn)在急需的是能夠幫助你產(chǎn)生MagicLinux的gcc,。


1.準(zhǔn)備環(huán)境

最好能在你的硬盤上劃分出一個(gè)獨(dú)立的分區(qū),,1G大小就夠了。不過這個(gè)你都

嫌麻煩的話,,你有1G以上的自由空間也行?,F(xiàn)在我假設(shè)你劃分了一個(gè)獨(dú)立的分區(qū)。

來吧,,創(chuàng)建/mnt/ml目錄,,并將你的新分區(qū)掛接到這上面(如果不了解掛接的

話,先找找資料,google一下mount),。


#mkdir /mnt/ml

#mount /dev/hda6 /mnt/ml (我假設(shè)你得心分區(qū)設(shè)備名為hda6)


cd到/mnt/ml目錄并創(chuàng)建toolchain目錄,。


#cd /mnt/ml

#mkdir toolchain


在你的根目錄創(chuàng)建一個(gè)連接到toolchain上(如果不了解,google一下ln),。


#ln -sv /mnt/ml/toolchain /toolchain


創(chuàng)建sources目錄,。


#mkdir sources


將binutils、gcc和glibc等的源代碼復(fù)制到sources目錄中,。你可以在網(wǎng)絡(luò)上找

到它們,,google一下就行了。binutils的最新本版是2.18,,源代碼包可能是這樣

的文件名:binutils-2.18.tar.bz2,;gcc的最新本版是4.2.2,源代碼包可能是

這樣的文件名:gcc-4.2.2.tar.bz2,;glibc的最新版本是2.7,源代碼包可能是

這樣的文件名:glibc-2.7.tar.bz2,。

修改PATH環(huán)境變量,。


#export PATH=/toolchain/bin:$PATH


PATH環(huán)境變量指定了shell命令的默認(rèn)搜索路徑,。我們修改PATH環(huán)境變量使得在你

的gcc可用時(shí),默認(rèn)執(zhí)行的是它,,而不是系統(tǒng)自帶的,。

環(huán)境已經(jīng)準(zhǔn)備好了,我們開始吧,。


2.創(chuàng)建新的gcc環(huán)境

為了創(chuàng)建完全獨(dú)立于你現(xiàn)有系統(tǒng)的gcc環(huán)境,,我們要?jiǎng)?chuàng)建兩次binutils和gcc。

他們創(chuàng)建的次序是很重要的,。我們現(xiàn)在進(jìn)行第一次創(chuàng)建,。進(jìn)入sources目錄。


#cd sources


2.1創(chuàng)建binutils

首先創(chuàng)建binutils,,是因?yàn)樵趧?chuàng)建gcc和glibc時(shí),,它們會(huì)檢測連接器和匯編器,

以便決定它們能夠開啟那些特性,。整個(gè)過程大概需要5分鐘(根據(jù)你機(jī)器的處理能力會(huì)

有很大的不同),,占用200MB左右的磁盤空間。

解壓縮源代碼包,,并進(jìn)入解壓后的目錄:


#tar -jvxf binutils-2.18.tar.gz

#cd binutils-2.18


由于binutils在某些時(shí)候會(huì)有一點(diǎn)小問題,,要修復(fù)它,需要下在一個(gè)補(bǔ)丁,,對應(yīng)2.18

版本的補(bǔ)丁是:binutils-2.18-configure-1.patch,。


#patch –Np1 -i ../binutils-2.18-configure-1.patch


binutils的文檔說應(yīng)該在一個(gè)獨(dú)立的目錄中創(chuàng)建binutils。那就創(chuàng)建一個(gè)build目錄,。


#mkdir build

#cd build


現(xiàn)在為創(chuàng)建binutils做準(zhǔn)備工作:


#CC=”gcc -B/usr/bin/”../configure \

--prefix=/toolchain --disable-nls --disable-werror


各選項(xiàng)的含義是:

CC=”gcc -B/usr/bin/”

告訴gcc使用你當(dāng)前操作系統(tǒng)/usr/bin目錄下的連接器,。這個(gè)對于某些你使用的Linux

發(fā)布是很重要的,因?yàn)樾聞?chuàng)建的連接器ld可能與它所提供的gcc不兼容,。

--prefix=/toolchain

這個(gè)參數(shù)告訴configure腳本,,把binutils軟件包中的程序安裝到/toolchina目

錄中,也就是

/mnt/ml/toolchain,。

--disable-nls

這個(gè)參數(shù)禁止了國際化(通常簡稱i18n),。此時(shí)根本不需要國際化支持。

--disable-werror

這個(gè)參數(shù)可以防止由于你的系統(tǒng)提供的gcc在產(chǎn)生警告事件時(shí)停止創(chuàng)建過程,。

準(zhǔn)備好了,,我們可以創(chuàng)建了:


#make


創(chuàng)建完成后,安裝:


#make install


別著急,,還沒完事,。還得調(diào)整一下:


#make –C ld clean

#make –C ld LIB_PATH=/toolchain/lib


make參數(shù)的含義是:

-C ld clean

告訴make,刪除所有子目錄ld中編譯生成的文件,。

-C ld LIB_PATH=/toolchain/lib

這個(gè)選項(xiàng)重新編譯ld子目錄中的所有文件,。LIB_PATH是Makefile的一個(gè)變量,,

在命令行里制定他,可以覆蓋默認(rèn)值,,并讓它指向/toolchain/lib目錄,。這個(gè)變

量的值指定了連接器的缺省庫搜索路徑。

手工將新的程序復(fù)制到/toolchain/bin目錄:


#cp –v ld/ld-new /toolchain/bin


好了,,binutils創(chuàng)建完成了,,你現(xiàn)在可以刪除build目錄了。但是不要?jiǎng)h除

binutils-2.18目錄,,因?yàn)檫€要編譯一次呢,。退回到sources目錄,準(zhǔn)備gcc的創(chuàng)建工

作,。


#cd ../

#rm –rf build

#cd ../


2.2 創(chuàng)建gcc

連接器準(zhǔn)備好了,,但我們這次先不使用它,沒有這個(gè)必要,,因?yàn)槲覀冞€需要再次

創(chuàng)建gcc的,,那時(shí)再用也不遲。這個(gè)過程大概會(huì)花費(fèi)你50分鐘的時(shí)間和650MB的磁盤空

間,。

解壓縮gcc的源代碼包并進(jìn)入源代碼目錄,。


#tar –jvxf gcc-4.2.2.tar.bz2

#cd gcc-4.2.2


gcc與binutils一樣,建議你在一個(gè)獨(dú)立的目錄中創(chuàng)建它,。創(chuàng)建build目錄,。


#mkdir build

#cd build


為創(chuàng)建gcc做準(zhǔn)備。


#../configure –prefix=/toolchain –with-local-prefix=/toolchain \

--disable-nls –enable-shared –enable-languages=c


各選項(xiàng)的含義是:

CC=”gcc -B/usr/bin/”

告訴gcc使用你當(dāng)前操作系統(tǒng)/usr/bin目錄下的連接器,。也就是不使用你剛創(chuàng)建完

的那個(gè)連接器ld,。這也是為了避免一些麻煩,可以參考創(chuàng)建binutils時(shí)對該選項(xiàng)的

說明,。

--with-local-prefix=/toolchain

默認(rèn)情況下,,gcc會(huì)搜索兩個(gè)include目錄,一個(gè)是其安裝目錄下的include,,這里是

/toolchian/include,,另外一個(gè)是/usr/local/include。這個(gè)選項(xiàng)就是將

/usr/local/include這個(gè)默認(rèn)搜索目錄刪除,,而還是指向/toolchain/include,。

--enable-shared

這個(gè)選項(xiàng)是為了創(chuàng)建出libgcc_s.so.1和libgcc_eh.a文件,因?yàn)橄乱粋€(gè)要?jiǎng)?chuàng)建的

glibc需要libgcc_eh.a,,要是沒有它就不會(huì)產(chǎn)生正確的結(jié)果,。

--enable-languages=c

因?yàn)間cc是一個(gè)編譯器集合,這個(gè)選項(xiàng)指定要?jiǎng)?chuàng)建何種語言的編譯器,。此時(shí)只需要C,,

那就沒什么可說的了,。

準(zhǔn)備好了,,我們可以開始創(chuàng)建了:


#make


創(chuàng)建完成,,安裝:


#make install


最后你還應(yīng)該創(chuàng)建一個(gè)符號連接cc到這個(gè)新的gcc,因?yàn)楹枚鄷r(shí)候會(huì)用cc而不是gcc,,這是為

了與Unix平臺保持一致,,便于程序的移植。


#ln –vs gcc /toolchain/bin/cc


好了,,gcc創(chuàng)建完成了,,接下來的創(chuàng)建過程會(huì)自動(dòng)使用這個(gè)gcc的,因?yàn)槟阈薷牧薖ATH環(huán)境變

量,。做些首尾工作,,要不然你的磁盤可能吃緊了。


#cd ../

#rm –rf build

#cd ../


2.3創(chuàng)建glibc

前面我說過,,glibc是自包含的,,不會(huì)依賴于那個(gè)軟件包。但是我也說過,,它是用戶程序與

內(nèi)核交流的標(biāo)準(zhǔn)借口,,因此對內(nèi)核還是有一定依賴的。但是這并不相矛盾,,因?yàn)橹灰且粋€(gè)系

列的內(nèi)核,,基本上是沒多少關(guān)系的,比如現(xiàn)今的2.6系列,,它們會(huì)有提供統(tǒng)一的系統(tǒng)調(diào)用,。

glibc需要了解內(nèi)核的系統(tǒng)調(diào)用和這些調(diào)用相關(guān)的一些數(shù)據(jù)結(jié)構(gòu)。Linux內(nèi)核做得很好,,不需

要有內(nèi)核的二進(jìn)制文件,,一切都包含在了內(nèi)核的公用頭文件中了。這里說些題外話,,如果你夠

牛的話,,其實(shí)完全可以不用glibc,只利用這些頭文件就可以寫出合適的用戶程序的,,甚至比利

用glibc的更為優(yōu)秀,。不過如果你的確那么牛,這篇文章也就不適合你了,。

不多說了,,下載一個(gè)內(nèi)核源代碼到你的source目錄吧。最新的是2.6.23.12,。

解壓縮內(nèi)核源代碼包并進(jìn)入源代碼目錄:


#tar –jvxf linux-2.6.23.12.tar.bz2

#cd linux-2.6.23.12


安裝相關(guān)的頭文件:


#make mrproper

#make headers_check

#make INSTALL_HDR_PATH=dest header_install

#cp –rv dest/include/* /toolchain/include

#cd ../


關(guān)于內(nèi)核操作有什么不了解的,,可以使用make help命令獲得幫助,。

解壓縮glibc的源代碼包并進(jìn)入源代碼目錄:


#tar –jvxf glibc-2.7.tar.bz2

#cd glibc-2.7


與gcc一樣,還需要單獨(dú)的目錄來創(chuàng)建,,建立build目錄:


#mkdir build

#cd build


由于glibc不再支持i386體系了,,因此它的開發(fā)者們建議在創(chuàng)建glibc是,最好使用-march=i486編譯選

項(xiàng),。的確如此,,如果你不指定這個(gè)選項(xiàng),會(huì)創(chuàng)建失敗,。但是畢竟現(xiàn)在i486用的已經(jīng)很少了,,我們

也可以不考慮兼顧,為了進(jìn)一步提高性能,,我建議使用-march=i686編譯選項(xiàng),。你可以通過下面的

命令完成這些:


#echo “CFLAGS += -march=i686” > configparms


接著,為創(chuàng)建glibc做準(zhǔn)備工作:


#configure –prefix=/toolchain –disable-profile –enable-add-ons \
--enable-kernel=2.6.0 –with-binutils=/toolchain/bin –without-gd \

--with=headers=/toolchain/include –without-selinux


各選項(xiàng)的含義如下:

--disable-profile

忽略掉profiling信息相關(guān)的庫文件創(chuàng)建,,這個(gè)時(shí)候一般不需要,。

--enable-add-ons

這個(gè)指示glibc使用附加的NPTL(本地POSIX線程庫)包作為線程庫。

--enable-kernel=2.6.0

告訴glibc要支持2.6.x內(nèi)核,。

--with-binutils=/toolchain/bin

這個(gè)參數(shù)并不是必要的,,只是為了防止在創(chuàng)建glibc時(shí)用錯(cuò)了binutils程序。這里保證使用剛才創(chuàng)建

好的binutils,。

--without-gd

保證不生成memusagestat程序,,這個(gè)程序會(huì)產(chǎn)生對你現(xiàn)有系統(tǒng)的依賴。

--with-headers=/toolchain/include

這個(gè)選項(xiàng)就是告訴glibc,,使用剛剛安裝的內(nèi)核都文件創(chuàng)建自己,。

--without-selinux

不提供SELinux特性的支持,因?yàn)閠oolchain是不需要的,。

在這個(gè)階段你要是看到下面的警告你就不用管它,,跟你沒有任何關(guān)系,也不會(huì)有什么影響的,。


configure: WARNING:

*** These auxiliary programs are missing or

*** incompatible versions: msgfmt

*** some features will be disabled.

*** Check the INSTALL file for required versions.


創(chuàng)建軟件包:


#make


在安裝glibc的過程中,,它會(huì)警告缺少/toolchain/etc/ld.so.conf文件。其實(shí)沒什事,,不會(huì)有什么影響,,只要提

供一個(gè)空文件它就閉嘴了:


#mkdir –v /toolchain/etc

#touch /toolchain/etc/ld.so.conf


一切順利就可以安裝了:


#make install


恭喜你,又干了一件了不起的事情,,不過別忘了首尾阿,,空間有限。


#cd ../

#rm –rf build

#cd ../


(未完,待續(xù)......)


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多