![ARM-Linux交叉編譯環(huán)境完全手冊_第1頁](http://file4.renrendoc.com/view3/M01/0E/08/wKhkFmagSXyAMbbEAAFNoGciidQ379.jpg)
![ARM-Linux交叉編譯環(huán)境完全手冊_第2頁](http://file4.renrendoc.com/view3/M01/0E/08/wKhkFmagSXyAMbbEAAFNoGciidQ3792.jpg)
![ARM-Linux交叉編譯環(huán)境完全手冊_第3頁](http://file4.renrendoc.com/view3/M01/0E/08/wKhkFmagSXyAMbbEAAFNoGciidQ3793.jpg)
![ARM-Linux交叉編譯環(huán)境完全手冊_第4頁](http://file4.renrendoc.com/view3/M01/0E/08/wKhkFmagSXyAMbbEAAFNoGciidQ3794.jpg)
![ARM-Linux交叉編譯環(huán)境完全手冊_第5頁](http://file4.renrendoc.com/view3/M01/0E/08/wKhkFmagSXyAMbbEAAFNoGciidQ3795.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
河北工業(yè)大學城市學院2012屆本科畢業(yè)設計說明書PAGEPAGE24PAGE1畢業(yè)設計中文摘要ARM-Linux交叉編譯環(huán)境的創(chuàng)建摘要:交叉編譯就是在一個平臺生成可以在另一個平臺執(zhí)行的代碼,它作為嵌入式系統(tǒng)開發(fā)的前提和準備,具有相當重要的作用,嵌入式系統(tǒng)的可執(zhí)行文件都是通過交叉編譯生成的。本文詳細介紹了建立嵌入式交叉編譯環(huán)境的具體步驟,通過分步編譯Binutils、GCC、glibc和GDB,最終成功完成了基于ARM-Linux的交叉編譯環(huán)境的建立,并成功通過測試。在本設計中還列舉了用crosstool-ng構建交叉編譯工具鏈的方法,這個方法比前一種簡單,而且比較快捷。這兩種方法制作的交叉編譯環(huán)境都具有高度的可靠性和穩(wěn)定性,并且具有較好的實用價值。關鍵詞:嵌入式linuxarm交叉編譯環(huán)境gcc目次1引言 21.1課題研究的目的意義 21.2課題歷史背景 31.3開發(fā)方案的選擇 62了解嵌入式開發(fā) 72.1Linux常用命令 72.1.1文件目錄類 72.1.2驅(qū)動掛載類 72.1.3壓縮解壓類 82.1.4源代碼包安裝 82.1.5進程控制類 92.1.6用戶帳號類 92.1.7網(wǎng)絡服務 92.2GCC包括的工具。 92.3交叉調(diào)試概念 103.分步編譯安裝源代碼與庫文件方法 113.1創(chuàng)建編譯環(huán)境 123.1.1首先設置環(huán)境變量: 123.1.2創(chuàng)建相關目錄 123.1.3安裝linux頭文件 123.2編譯binutils 133.3編譯bootstrap-gcc 143.4編譯Glibc 153.5編譯完整Gcc 173.6編譯GDB 174用crosstool-ng構建交叉編譯工具鏈 194.1下載crosstool-ng 204.2安裝所必須的工具文件 204.3安裝crosstool-ng 204.4復制交叉編譯文件 204.5配置交叉編譯工具鏈 214.6編譯工具鏈 224.7增加環(huán)境變量 22結論 24參考文獻 25致謝 271引言1.1課題研究的目的意義嵌入式系統(tǒng)無疑是當前最熱門最有發(fā)展前途的IT應用領域之一。嵌入式系統(tǒng)用在一些特定專用設備上,通常這些設備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感,有時對實時響應的要求很高等。特別是隨著消費家電的智能化,嵌入式更顯重要。像我們平常常見到的手機、PDA、電子字典、可視電話、VCD/DVD/MP3Player、數(shù)字相機(DC)、數(shù)字攝像機(DV)、U-Disk、機頂盒(SetTopBox)、高清電視(HDTV)、游戲機、智能玩具、交換機、路由器、數(shù)控設備或儀表、汽車電子、家電控制系統(tǒng)、醫(yī)療儀器、航天航空設備等等都是典型的嵌入式系統(tǒng)。伴隨著嵌入式產(chǎn)品的迅速發(fā)展,使得嵌入式軟件開發(fā)再度成為一個研究熱點。由于嵌入式設備的性能局限,往往不能通過本機編譯得到所需軟件的可執(zhí)行程序。因此,以Linux為主機操作系統(tǒng),搭配一個交叉編譯系統(tǒng),為嵌入式設備生成可執(zhí)行程序已成為現(xiàn)在日益流行的編譯嵌入式軟件的解決方案。而開放源碼的編譯器GCC,經(jīng)過多年的發(fā)展,已能支持幾乎所有知名廠商的處理器,是嵌入式軟件開發(fā)中理想的交叉編譯器。但現(xiàn)有GCC支持的平臺并不能滿足層出不窮的嵌入式產(chǎn)品的開發(fā)需要,仍有許多平臺得不到支持。隨著信息技術的發(fā)展,微型化和專業(yè)化成為信息產(chǎn)品發(fā)展的新趨勢,嵌入式產(chǎn)品成為信息產(chǎn)業(yè)的主流。而ARM技術的日益成熟和廣泛應用,使得基于ARM核的微處理器已經(jīng)成為嵌入式市場的首選。建立面向ARM構架的嵌入式操作系統(tǒng)也就成為當前研究的熱點問題。在眾多的嵌入式操作系統(tǒng)中,許多開發(fā)人員都選擇Linux,主要是因為它是源碼公開而且是免費的,可以讓任何人將其修改移植到自己的目標平臺系統(tǒng)里使用。系統(tǒng)可以通過配置內(nèi)核,動態(tài)地加載和卸載內(nèi)核模塊機制,可以方便地在內(nèi)核中添加新的組件或卸載不再需要的內(nèi)核組件。交叉編譯環(huán)境是嵌入式開發(fā)必不可少的工具,在進行項目開發(fā)的時候必須搭建一套開發(fā)環(huán)境,包括操作系統(tǒng)、連接器、編譯器及調(diào)試器在內(nèi)的軟件開法工具。交叉編譯的實現(xiàn)解決了嵌入式系統(tǒng)目標平臺存儲空間和運算能力有限的缺點,完善的工具鏈可以保證項目開發(fā)的進度和質(zhì)量,是嵌入式開發(fā)的基礎。1.2課題歷史背景Linux是一種自由和開放源碼的類Unix操作系統(tǒng)。目前存在著許多不同的Linux,但它們都使用了Linux內(nèi)核。Linux可安裝在各種計算機硬件設備中,從手機、平板電腦、路由器和視頻游戲控制臺,到臺式計算機、大型機和超級計算機。Linux是一個領先的操作系統(tǒng),世界上運算最快的10臺超級計算機運行的都是Linux操作系統(tǒng)。嚴格來講,Linux這個詞本身只表示Linux內(nèi)核,但實際上人們已經(jīng)習慣了用Linux來形容整個基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。20世紀50年代,IBM的JohnBackus帶領一個研究小組對FORTRAN語言及其編譯器進行開發(fā)。但由于當時人們對編譯理論了解不多,開發(fā)工作變得既復雜又艱苦。與此同時,NoamChomsky開始了他對自然語言結構的研究。他的發(fā)現(xiàn)最終使得編譯器的結構異常簡單,甚至還帶有了一些自動化。Chomsky的研究導致了根據(jù)語言文法的難易程度以及識別它們所需要的算法來對語言分類。正如現(xiàn)在所稱的Chomsky架構(ChomskyHierarchy),它包括了文法的四個層次:0型文法、1型文法、2型文法和3型文法,且其中的每一個都是其前者的特殊情況。2型文法(或上下文無關文法)被證明是程序設計語言中最有用的,而且今天它已代表著程序設計語言結構的標準方式。分析問題(parsingproblem,用于上下文無關文法識別的有效算法)的研究是在60年代和70年代,它相當完善的解決了這個問題。現(xiàn)在它已是編譯原理中的一個標準部分。有限狀態(tài)自動機(FiniteAutomation)和正則表達式(RegularExpression)同上下文無關文法緊密相關,它們與Chomsky的3型文法相對應。對它們的研究與Chomsky的研究幾乎同時開始,并且引出了表示程序設計語言的單詞的符號方式。人們接著又深化了生成有效目標代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常將其稱為優(yōu)化技術(OptimizationTechnique),但因其從未真正地得到過被優(yōu)化了的目標代碼而僅僅改進了它的有效性,因此實際上應稱作代碼改進技術(CodeImprovementTechnique)。當分析問題變得好懂起來時,人們就在開發(fā)程序上花費了很大的功夫來研究這一部分的編譯器自動構造。這些程序最初被稱為編譯器的編譯器(Compiler-compiler),但更確切地應稱為分析程序生成器(ParserGenerator),這是因為它們僅僅能夠自動處理編譯的一部分。這些程序中最著名的是Yacc(YetAnotherCompiler-compiler),它是由SteveJohnson在1975年為Unix系統(tǒng)編寫的。類似的,有限狀態(tài)自動機的研究也發(fā)展了一種稱為掃描程序生成器(ScannerGenerator)的工具,Lex(與Yacc同時,由MikeLesk為Unix系統(tǒng)開發(fā))是這其中的佼佼者。在20世紀70年代后期和80年代早期,大量的項目都貫注于編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試并未取得多少成功,這大概是因為操作太復雜而人們又對其不甚了解。編譯器設計最近的發(fā)展包括:首先,編譯器包括了更加復雜算法的應用程序它用于推斷或簡化程序中的信息;這又與更為復雜的程序設計語言的發(fā)展結合在一起。其中典型的有用于函數(shù)語言編譯的Hindley-Milner類型檢查的統(tǒng)一算法。其次,編譯器已越來越成為基于窗口的交互開發(fā)環(huán)境(InteractiveDevelopmentEnvironment,IDE)的一部分,它包括了編輯器、連接程序、調(diào)試程序以及項目管理程序。這樣的IDE標準并沒有多少,但是對標準的窗口環(huán)境進行開發(fā)已成為方向。另一方面,盡管近年來在編譯原理領域進行了大量的研究,但是基本的編譯器設計原理在近20年中都沒有多大的改變,它現(xiàn)在正迅速地成為計算機科學課程中的中心環(huán)節(jié)。在20世紀90年代,作為GNU項目或其它開放源代碼項目標一部分,許多免費編譯器和編譯器開發(fā)工具被開發(fā)出來。這些工具可用來編譯所有的計算機程序語言。它們中的一些項目被認為是高質(zhì)量的,而且對現(xiàn)代編譯理論感興趣的人可以很容易的得到它們的免費源代碼。大約在1999年,SGI公布了他們的一個工業(yè)化的并行化優(yōu)化編譯器Pro64的源代碼,后被全世界多個編譯器研究小組用來做研究平臺,并命名為Open64。Open64的設計結構好,分析優(yōu)化全面,是編譯器高級研究的理想平臺。在一種計算機環(huán)境中運行的編譯程序,能編譯出在另外一種環(huán)境下運行的代碼,我們就稱這種編譯器支持交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。這里需要注意的是所謂平臺,實際上包含兩個概念:體系結構(Architecture)、操作系統(tǒng)(OperatingSystem)。同一個體系結構可以運行不同的操作系統(tǒng);同樣,同一個操作系統(tǒng)也可以在不同的體系結構上運行。舉例來說,我們常說的x86Linux平臺實際上是Intelx86體系結構和Linuxforx86操作系統(tǒng)的統(tǒng)稱;而x86WinNT平臺實際上是Intelx86體系結構和WindowsNTforx86操作系統(tǒng)的簡稱。有時是因為目的平臺上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特征;有時是因為目的平臺上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平臺還沒有建立,連操作系統(tǒng)都沒有,根本談不上運行什么編譯器。交叉編譯這個概念的出現(xiàn)和流行是和嵌入式系統(tǒng)的廣泛發(fā)展同步的。我們常用的計算機軟件,都需要通過編譯的方式,把使用高級計算機語言編寫的代碼(比如C代碼)編譯(compile)成計算機可以識別和執(zhí)行的二進制代碼。比如,我們在Windows平臺上,可使用VisualC++開發(fā)環(huán)境,編寫程序并編譯成可執(zhí)行程序。這種方式下,我們使用PC平臺上的Windows工具開發(fā)針對Windows本身的可執(zhí)行程序,這種編譯過程稱為nativecompilation,中文可理解為本機編譯。然而,在進行嵌入式系統(tǒng)的開發(fā)時,運行程序的目標平臺通常具有有限的存儲空間和運算能力,比如常見的ARM平臺,其一般的靜態(tài)存儲空間大概是16到32MB,而CPU的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈(compilationtoolchain)需要很大的存儲空間,并需要很強的CPU運算能力。為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、存儲控件足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序。交叉編譯就是在一個平臺上通過編譯器編譯某個源程序,生成的可執(zhí)行代碼在另一個平臺上也能運行。經(jīng)典的交叉編譯是指在PC機上編譯出能在嵌入式目標機上運行的可執(zhí)行代碼。因為嵌入式的目標主機硬件資源有限,不能獨立自主的完成程序的編譯工作,從另外一個角度,嵌入式主機上運行的程序調(diào)試穩(wěn)定后,基本不需要修改,也沒有必要具備完成自身程序的編譯工作。因此,在嵌入式系統(tǒng)開發(fā)時,常常由宿主機開發(fā)程序,目標機作為執(zhí)行機。兩者在開發(fā)時需要時時交替結合進行。一般把編譯程序的主機稱為宿主機(Host),把運行程序的嵌入式主機稱為目標機(Target)。為了使宿主機上開發(fā)的程序(應用程序和驅(qū)動程序)能夠方便地下載到目標機上運行,一般還要在宿主機上配置好網(wǎng)絡,使其支持NFS或tftp等網(wǎng)絡服務,從而實現(xiàn)兩臺機器之間的文件共享。交叉編譯環(huán)境一般由交叉編譯器、交叉連接器和C程序庫glibc等一系列的交叉工具集組成。這些交叉工具通過配置二進制工具Binutils包來產(chǎn)生。通常基于ARM的Linux交叉編譯器為arm-linux-gcc、交叉連接器arm-linux-ld。1.3開發(fā)方案的選擇Linux環(huán)境模式選擇:嵌入式Linux操作系統(tǒng)是交叉編譯環(huán)境搭建的重要基礎,只有有了操作系統(tǒng)的支持,整個系統(tǒng)才能有條不紊的進行。Linux開發(fā)環(huán)境方案有以下幾種:Windows+Linux+目標系統(tǒng):安裝多個操作系統(tǒng)只需一臺計算機,但是在調(diào)試應用程序時需要在兩個系統(tǒng)之間進行切換,會比較麻煩和費時;Windows+Cygwin+目標系統(tǒng):Cygwin是一個模擬Linux環(huán)境軟件,此模式具有快速省時的優(yōu)點,但并不能真實的模擬Linux,且系統(tǒng)穩(wěn)定性差;Windows+Vmware虛擬機(Linux)+目標系統(tǒng):Vmware可以在不破壞原有操作系統(tǒng)的基礎上,虛擬出一臺真實的計算機出來,只需要在這臺虛擬計算機上安裝Linux,其效果和真實Linux系統(tǒng)完全一樣。我選擇的是第三種方法,這種方法可能會編譯的慢些,但是方便與網(wǎng)絡的互聯(lián),與Windows下的文件共享也方便,一邊在虛擬機上調(diào)試方法,一邊在Windows上查閱資料,一臺電腦可以當兩臺用,確實很方便。通過安裝crosstool-ng,復制交叉編譯文件,配置交叉編譯工具鏈,編譯工具鏈,增加環(huán)境變量,最終制作出適合需要的交叉編譯工具。2了解嵌入式開發(fā)2.1Linux常用命令2.1.1文件目錄類1)mkdir目錄名 建立目錄2)rmdir目錄名 刪除空目錄3)rm-rf目錄名 無條件刪除子目錄4)cd目錄名 改變當前目錄(進入用戶home目錄:cd~;進入上一級目錄:cd..)5)pwd 查看自己所在目錄6)du 查看當前目錄大小7)ls–l 顯示目錄文件列表(-a:增加顯示隱含目錄)其中:藍:目錄;綠:可執(zhí)行文件;紅:壓縮文件;淺藍:鏈接文件;灰:其他文件;紅底白字:錯誤的鏈接文件8)cat文件名 瀏覽文件9)cp源文件目標文件 復制文件(-r:包含目錄)10)find文件名 查找文件11)ln源文件鏈接文件 建立hard鏈接(-d:創(chuàng)建目錄鏈接);2.1.2驅(qū)動掛載類1)df–h 檢查硬盤使用的情況2)fdisk–l 檢查磁盤分區(qū)3)mount 掛載軟硬光區(qū),其中: 掛載光驅(qū):mount-tauto/dev/cdrom/mnt/cdrom 掛載ISO文件:mount-tiso9660-oloopxxx.iso/path4)umount/mnt/目錄名 解除掛載(解除所有的掛載:umount-a)5)mkfs 建立文件系統(tǒng)2.1.3壓縮解壓類1).tar 解包:tarxvfFileName.tar打包:tarcvfFileName.tarDirName2).gz 解壓1:gunzipFileName.gz;解壓2:gzip-dFileName.gz壓縮:gzipFileName3).tar.gz和.tgz 解壓:tarzxvfFileName.tar.gz壓縮:tarzcvfFileName.tar.gzDirName4).bz2 解壓1:bzip2-dFileName.bz2;解壓2:bunzip2FileName.bz2壓縮:bzip2-zFileName5).tar.bz2 解壓:tarjxvfFileName.tar.bz2壓縮:tarjcvfFileName.tar.bz2DirName6).tar.bz 解壓:tarjxvfFileName.tar.bz壓縮:未知7).Z 解壓:uncompressFileName.Z壓縮:compressFileName8).zip 解壓:unzipFileName.zip壓縮:zipFileName.zipDirName2.1.4源代碼包安裝1)配置:在解壓目錄下./configure2)編譯:在解壓目錄下make3)安裝:在解壓目錄下makeinstall2.1.5進程控制類1)ps-auxw 列出當前進程ID;2)kill進程ID號 終止單一進程;3)Killall程序名 終止該程序所有進程;4)xkill 終止X-Window程序;5)top 查看資源占用情況;6)env 查看環(huán)境變量的值;7)reboot 重啟;8)shutdown-hnow 關機;2.1.6用戶帳號類1)增加用戶帳號: 用戶名:adduser帳號名2)設置密碼: passwd帳號名3)刪除用戶帳號: userdel帳號名4)增加用戶組: groupadd用戶組名5)刪除用戶組: groupdel用戶組名6)暫時終止用戶帳號:passwd-l帳號名7)恢復被終止帳號: passwd-u帳號名2.1.7網(wǎng)絡服務1)ifconfig 顯示網(wǎng)絡接口的參數(shù)2)mail 顯示系統(tǒng)的郵件3)httpd-kstart|stop 啟動或終止web服務4)pingxxx.xxx.xxx.xxx 查看網(wǎng)絡狀況,聯(lián)機狀況:ping[-dfnqrRv][-c<完成次數(shù)>][-i<間隔秒數(shù)>][-l<前置載入>][-p<范本樣式>][-s<數(shù)據(jù)包大小>][-t<存活數(shù)值>][主機名稱或IP地址]2.2GCC包括的工具。1)cppGNU預處理器,主要用于擴展用戶源程序的頭文件和宏定義。cpp是GNUC編譯器的預處理器。cpp是一個宏指令處理器,GNUC編譯器在編譯前自動使用cpp對用戶程序進行轉換。cpp之所以稱為宏指令處理器是因為它允許用戶定義宏指令(長結構的簡寫)。2)GCC符合ISO等標準的C編譯器。3)g++基本符合ISO等標準的C++編譯器。4)Binutils是一組二進制工具程序集,它包括addr2line、ar、as、gprof、ld、nm、objcopy、objdump、ranlib、size、strings、strip等工具。是輔助GCC的主要軟件。5)AsGNU匯編器(Assemble),主要用于把匯編代碼轉換成二進制代碼,并存放到一個object文件中。6)LdGNU鏈接器(Linker),主要用于確定相對地址,把多個object文件、起始(Startup)代碼段、庫(Library)等鏈接起來,并最終形成一個可執(zhí)行文件。7)Addr2line把可執(zhí)行程序中的地址映射到源文件的對應行。8)Ar創(chuàng)建歸檔文件(Archive)。修改/替換掉庫中的object文件。向庫中添加/提取object文件。9)C++file解碼C++符號名。10)Nm列出object文件中的符號。11)Objcopy用來顯示對象文件的信息。12)Ranlib根據(jù)歸檔文件(Archive)中內(nèi)容建立索引。13)Readelf顯示object文件和執(zhí)行文件各節(jié)(Section)和總的大小。14)Strings顯示文件中可以打印的字符。15)Strip去掉執(zhí)行文件中多余的信息(如調(diào)試信息等),可減少執(zhí)行文件的大小。2.3交叉調(diào)試概念在開發(fā)嵌入式應用軟件時,交叉調(diào)試是必不可少的一步。嵌入式應用的特點決定了其調(diào)試具有如下的特點:1)調(diào)試器(Debugger)和被調(diào)試程序(Debuggee)運行在不同的計算機上。Debugger運行在一般的PC機或者工作站上(即Host上),而Debuggee運行在實際的某種嵌入式設備或者專業(yè)的評估板上(都被稱為Target)。2)Debugger通過某種通信方式與目標機建立聯(lián)系。通信方式可以是串口、并口、網(wǎng)絡、或者專用的通信方式。3)一般在目標機上有Debugger的某種代理(Agent),這種代理能與Debugge一起配合完成對目標機上運行的程序的調(diào)試。這種代理可以是某種軟件,也可以是某種支持調(diào)試的硬件等。4)目標機也可以是一種虛擬機。在這種情形下,似乎Debugger和Debuggee運行在了同一臺計算機。但是調(diào)試方式的本質(zhì)沒有變化,即Debuggee都是被下載到了目標機,對Debuggee的調(diào)試并不是直接通過Host的操作系統(tǒng)的調(diào)試支持來完成的,而是通過虛擬機代理的方式來完成調(diào)試。3.分步編譯安裝源代碼與庫文件方法交叉編譯使用的軟件包如下表1整個編譯過程的步驟:⑴創(chuàng)建編譯環(huán)境。在該這過程中,將設置必須的環(huán)境變量,創(chuàng)建安裝目錄,安裝內(nèi)核源代碼和頭文件等。⑵創(chuàng)建binutils。創(chuàng)建完畢后,會創(chuàng)建類似arm-linux-ld等工具。⑶創(chuàng)建一個交叉編譯版本的gcc。這個過程中,只能編譯c程序,不能編譯c++程序⑷創(chuàng)建一個交叉編譯版本的glibc。⑸創(chuàng)建一個交叉編譯版本的gdb。會創(chuàng)建arm-linux-gdb⑹重新創(chuàng)建gcc。⑺最后重新創(chuàng)建glibc。3.1創(chuàng)建編譯環(huán)境下載的壓縮文件存放在/usr/src/tars中;解壓之后的文件存放在/usr/src/source中;解壓后的linux內(nèi)核存放在/usr/src/linux中;編譯的路徑在/usr/src/build中;生成的arm-linux交叉編譯工具在/usr/local/arm-linux中。3.1.1首先設置環(huán)境變量:#exportVBINUTILS=2.16#exportVGCC=3.4.4#exportVGLIBC=2.3.3#exportVGLIBCTHREADS=2.3.3#exportVGDB=6.4#exportVLinuxKERNEL=#exportPREFIX=/usr/local#exportHOST=i686-pc-linux-gnu#exportARCH=arm#exportTARGET=arm-linux#exportTDIR=/usr/src/tars#exportSDIR=/usr/src/source#exportBDIR=/usr/src/build3.1.2創(chuàng)建相關目錄#mkdir–p$SDIR#mkdir–p$BDIR#mkdir–p$BDIR/binutils#mkdir–p$BDIR/gcc#mkdir–p$BDIR/glibc#mkdir–p$BDIR/gdb3.1.3安裝linux頭文件#cd/usr/src#tarzxvj$TDIR/linux-$VLinuxKERNEL.tar.bz23.1.4使用ARM平臺的庫文件。創(chuàng)建相關鏈接。#cdlinux$VLinuxKERNEL/include/asm-arm#rm–farchproc#ln–sarch–s3c2410arch#ln–sarch–s3c2410arch#ln–sproc–armvproc#cd../../3.2編譯binutils首先要安裝的軟件包是binutils,這步非常重要,Glibc和gcc會針對可用的連接器和匯編器進行多種測試,來決定打開某些特性。解壓binutils軟件包:#cd$SDIR#tarxvfj$TDIR/binutils-$VBINUTILS.tar.bz2#cd$BDIR/binutils配置,編譯和安裝binutils#$SDIR/binutils-$VBINUTILS/configure–host=$HOST\--target=$TARGET\--prefix=$PREFIX\--with-lib-path=$PREFIX/$TARGET/lib:\$PREFIX/$TARGET/lib/be:\$PREFIX/$TARGET/lib/soft-float:\$PREFIX/$TARGET/lib/be/soft-float\#make#makeinstall#chmod777$PREFIX/$TARGET/arm-linux目錄下有bin和lib兩個子目錄。Bin目錄下保存了二進制文件,即ar、as、ld、nm、ranlib、和strip幾個文件。Lib目錄下有l(wèi)dscripts子目錄,里邊存放了一些腳本文件。/bin目錄下存放生成的二進制工具,這些文件是用語ELF執(zhí)行格式的,前綴使用arm-linux。/lib目錄下存放了libiberty.a庫文件。3.3編譯bootstrap-gcc創(chuàng)建交叉編譯版本的gcc,需要交叉編譯版本的Glibc及頭文件,而交叉編譯版本的Glibc是通過交叉編譯版本的gcc創(chuàng)建的。先編譯對c語言的支持,并禁止支持線程。編譯gcc之前需要進行修改,首先修改gcc源代碼中的gcc/config/arm/t-linux文件。#justforthese,weomittheframepointersinceitmakessuchabig#difference.ItisthenpointlessaddingdebuggingTARGET_LIBGCC2_CFLAGS=-pomit-frame-pointer-fPIC-Dinhibit_libc-D__gthr_posixLIBGCC2_DEBUG_CFLAGS=-g0#don`tbuildenquireENQUIRE=LIB1ASMSRC=arm/lib1funcs.asmLIB1ASMFUNCS=_udivsi3_divsi3_umodsi3_modsi3_dvmd_lnx\_bb_init_func_call_via_rX_interwork_call_via_rX\_negdf2_addsubdf3_muldivdf3_cmpdf2_unorddf2_fixdfsi_fixunsdfsi\_truncdfsf2_negsf2_addsubsf3_muldivsf3_cmpsf2_unordsf2\_fixsfsi_fixunssfsi#MULTILIB_OPTIONS=mhard-float/msotf-float#MULTILIB_DIRNAMES=hard-floatsoft-float#EXTRA_MULTILIB_PARTS=crtbegin.ocrtend.oMULTILIB_OPTIONS=mlittle-endian/mbig-endianmhard-float/msoft-floatMULTILIB_DIRNAMES=lebehard-floatsoft-floatEXTRA_MULTILIB_PARTS=crtbegin.ocrtbeginS.ocrtend.ocrtendS.ocrti.ocrtn.oLIBGCC=stmp-multilibINSTALL-LIBGCC=install-multilibT_CFLAGS=-Dinhibit_libc–D___gthr_posix_h#LIBGCC=stmp-multilib#INSTALL_LIBGCC=install-multilib#Assemblestartupfiles.$(T)crti.o:$(srcdir)/config/arm/crti.asm$(GCC_PASSES)$(GCC_FOR_TARGET)$(GCC-CFLAGS)$(MULTILIB_CFLAGS)$(INCLUDES)\-c–o$(T)crti.o–xassembler-with-cpp$(srcdir)/config/arm/crti.asm$(T)crtn.o:$(srcdir)/config/arm/crtn.asm$(GCC_PASSES)$(GCC_FOR_TARGET)$(GCC_CFLAGS)$(MULTILIB_CFLAGS)$(INCLUDES)\-c–o$(T)crtn.o–xassembler-with-cpp$(srcdir)/config/arm/crtn.asmTARGET_LIBGCC2-CFLAGS=-fomit-frame-pointer-fPICLIBGCC2_DEBUG_CFLAGS=-g0LIB1ASMSRC=arm/lib1funcs.asmLIB1ASMFUNCS=_udivsi3_divsi3_umodsi3_modsi3_dvmd_lnx需要修改gcc/config/arm/linux-elf.h文件,刪除文件中對LIBGCC-SPEC的定義。接下來解壓軟件包、配置、編譯、安裝等。#cd$SDIR#tarxvfj$TDIR/gcc-$VGCC.tar.bz2#cd$BDIR/gcc#../configure–target=$TARGET--disable-shared--disable-threads--prefix=$PREFIX--with-headers=/usr/src/linux-$VLinuxKERNEL/include--with-gnu-as--with-gun-ld--enable-multilib--enable-languages=cap:/embedded/app#makeap:/embedded/app#makeinstall3.4編譯Glibcglibc是gnu發(fā)布的libc庫,即c運行庫。glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運行庫都會依賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務外,它本身也提供了許多其它一些必要功能服務的實現(xiàn)。由于glibc囊括了幾乎所有的
UNIX
通行的標準,可以想見其內(nèi)容包羅萬有。而就像其他的UNIX系統(tǒng)一樣,其內(nèi)含的檔案群分散于系統(tǒng)的樹狀目錄結構中,像一個支架一般撐起整個作業(yè)系統(tǒng)。在GNU/Linux系統(tǒng)中,其C函式庫發(fā)展史點出了GNU/Linux演進的幾個重要里程碑,用glibc作為系統(tǒng)的C函式庫,是GNU/Linux演進的一個重要里程碑。創(chuàng)建Glibc需要的時間很長,也容易出錯。之前創(chuàng)建了arm-linux-gcc,arm-linux-ar和arm-linux-ranlib等工具。在編譯Glibc前,還要進行一些修改。#cd$SDIR#tarxvfz$TDIR/glibc-$VGLIBC.tar.gz#cd$SDIR/glibc-$VGLIBC#rm–rfnptl#tarxvfz$TDIR/glibc-linuxthreads-$VGLIBCTHREADS.tar.gz源代碼準備好后,修改4個文件,Sysdeps/unix/sysv/linux/arm/ioperm.c把文件中的BUS_ISA修改為CT_BUS_ISA.Config.make.in將文件中的slibdir=@libc_cv_slibdir@修改為slibdir=@libdir@.Makeconfig修改優(yōu)化級別,從o2改為o。Configure修改優(yōu)化級別,從o2改為o。然后還要創(chuàng)建一個文件:#touchsysdeps/arm/framestate.c然后開始編譯工作:#cd$BDIR/glibc#CC=”arm-linux-gcc–mbig-endian–finline-limit=10000AS=”arm-linux-as–mbig-endian”LD=”arm-linux-ld–EB”$SDIR/glibc-$VGLIBC/configure–host=$TARGET--build=i686-pc-linux-gnu--with-headers=/usr/src/linux-$VLinuxKERNEL/include--enable-add-ons--enable-shared--prefix=$PREFIX/$TARGET--libdir=/$PREFIX/$TARGET//lib/be#make#makeinstall3.5編譯完整Gcc之前做出來的Glibc和頭文件,現(xiàn)在創(chuàng)建完整的Gcc。gcc/config/arm/t-linux刪除文件中的”-Dinhibit_libc”選項,這個選項是我們在編譯bootstrap_gcc時添加進去的,當時是為了繞過一些檢查。gcc/config/arm/linux-elf.h如果編譯bootstrap_gcc的過程中沒有做過這個操作,則刪除文件中“LIBGCC_SPEC”的定義。libjava/java/net/natInetAddressPosix.cc在gcc源代碼目錄中執(zhí)行下面命令即可。Perl–pi–e`s/intnamelen/unsignedintnamelen/`libjava/java/net/natLnetAddressPosix.cc然后開始編譯#cd$BDIR#rm–rfgcc#mkdirgcc#$SDIR/gcc-$VGCC/configure--target=arm-linux-disable-shared--prefix=$PREFIX--with-headers=/usr/src/linux-$VLinuxKERNEL/include--with-gnu-as--with-gnu-ld--enable-languages=c#make#makeinstall3.6編譯GDBGUN的GDB是一款非常強大的調(diào)試器。如果要調(diào)試的是ARM的可執(zhí)行代碼,需要交叉編譯后的GDB。#cd$SDIR#tarxvfj$TDIR/gdb-VGDB.tar.bz2#cd$BDIR/gdb#$VGDB/configure–build=$HOST--target=$TARGET--perfix=$PREFIX#make#makeinstall編譯完成,下面是各目錄作用:$PREFIX目錄結構目錄名內(nèi)容Arm-linux和target相關的文件Bin交叉開發(fā)工具集Include頭文件InfoGcc的info文件Lib庫文件Man幫助文檔Share交叉開發(fā)工具和庫文件共享的文件表2arm-linux目錄結構目錄名內(nèi)容Bin和glibc相關的target二進制文件和腳本Etc這里只有rpc文件Include頭文件InfoGlibc的info文件LibTarget的庫文件Libexec這里只有pt_chownSbinTarget中的/sbin目錄Share和國際化相關的子目錄,文件Sys-include這里存放glibc沒有安裝的頭文件,由gcc腳本復制4.1下載crosstool-ngcrosstool-ng的下載地址為/download/crosstool-ng,目前最高版本為1.9.3。需要注意的是,在下載完crosstool-ng之后,需要在http:///download/crosstool-ng/01-fixes/中查看一下是否有相應版本的補丁,如果有就一并下載下來。4.2安裝所必須的工具文件用crosstool-ng構建交叉編譯環(huán)境,需要安裝所必備的工具文件,否則在編譯過程中會產(chǎn)生錯誤。這些工具文件包括:bison、flex、texinfo、automake、libtool、patch、gcj、cvs、cvsd、gawk。安裝的方法在Ubuntu環(huán)境下比較簡單,在聯(lián)網(wǎng)的環(huán)境下,只需要在終端輸入$sudoapt-getinstallxxx并輸入密碼就可以了。4.3安裝crosstool-ng將下載的crosstool-ng-1.9.3.tar.bz2文件進行解壓,筆者解壓的目錄為/home/crosstool-ng,解壓好的文件夾為crosstool-ng-1.9.3。如果存在補丁文件,則需要在此目錄中運行patch-p1<"補丁文件"之后在crosstool-ng文件夾下新建install安裝目錄并在終端中執(zhí)行:1)配置sudo./configure–prefix=/home/crosstool-ng/install2)編譯sudomake3)安裝sudomakeinstall4.4復制交叉編譯文件生成交叉編譯工具之前,需要準備配置文件。可以復制對于ARM環(huán)境編譯的配置文件到安裝目錄,這個配置文件在sample目錄下。在終端執(zhí)行:cp/home/crosstool-ng/crosstool-ng-1.9.3/samples/arm-unknown-linux-gnueabi/*/home/crosstool-ng/install/bin4.5配置交叉編譯工具鏈復制好構建交叉編譯工具所需的配置文件之后,還需對其進行環(huán)境設置。進入安裝目錄cd/home/crosstool-ng/install/bin,執(zhí)行sudo./ct-ngmenuconfig1)下載編譯所需源碼包并設置路徑在隨后的編譯過程中,需要一系列的軟件包,程序在執(zhí)行過程中如果在本地磁盤找不到這些軟件包,會自動去網(wǎng)上下載,但是會放慢整個編譯過程。通過查看crosstool/install/bin目錄下的.config文件,可以得知所必需的軟件包。通過預先下載這些軟件包并存放在本地磁盤上,可以大大加快編譯速度。具體的軟件在此不具體列出,讀者可以自行分析。在該文中在crosstool下新建目錄src并將下載下來的軟件包存放于此。修改源碼包的下載路徑,在該文中修改為/home/crosstool-ng/src2)修改交叉編輯安裝路徑交叉編譯器的安裝位置,在該文中修改為/home/crosstool-ng/build3)修改交叉編譯體系對于ARM處理器來說,由于其不同的體系結構、地址空間和指令位數(shù),因此在編譯器上并不相同。對于S3C2410/S3C2440處理器芯片來說,核心是arm920t;而對于S3C6410來說,用的是armv6的框架,因此需要選擇armv6。對于不同的處理器芯片,首先查詢芯片手冊得到其處理器結構框架。該文以S3C2440為例,在Targetoptions>下,進行如下選擇:(armv4t)Architecturelevel(arm9tdmi)EmitassemblyforCPU(arm920t)TuneforCPU4)內(nèi)核源碼版本修改確定編譯系統(tǒng)的Linux內(nèi)核版本。該文的Linux內(nèi)核為5。在install/bin目錄下,修改.config文件.修改其中的內(nèi)核版本。CT_KERNEL_VERSION=修改為CT_KERNEL_VERSION=5CT_KERNEL_V_2_6_33_7=y修改為CT_KERNEL_V_2_6_32_15=yCT_LIBC_GLIBC_MIN_KERNEL=修改為CT_LIBC_GLIBC_MIN_KERNEL=5其它選項不需要改變,保存之后退出就可以了。5)一些個性化設置在Toolchainoptions>選項中修改為:(liueg)Tuple’svendorstring這樣生成的編譯器前綴就是:arm-liueg-linux-gnueabi-。這一步也可以省略,則生成的編譯器前綴就是:arm-none-linuxgnueabi-。4.6編譯工具鏈在終端中執(zhí)行sudo./home/crosstool-ng/install/bin/ct-ngbuild,經(jīng)過漫長的等待之后,crosstool-ng會經(jīng)歷軟件包解壓,配置,編譯,鏈接,大概需要兩個小時之后,如果沒有提示錯誤,就可以得到相應的工具鏈了。4.7增加環(huán)境變量環(huán)境變量是一個具有特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。例如path,當要求系統(tǒng)運行一個程序而沒有告訴它程序所在的完整路徑時,系統(tǒng)除了在當前目錄下面尋找此程序外,還應到path中指定的路徑去找。用戶通過設置環(huán)境變量,來更好的運行進程。$sudogedit/etc/environment在path中添加/home/crosstool-ng/build/bin目錄,保存后退出。接著在終端執(zhí)行:$source/etc/environment此時在終端輸入arm-liueg-linux-gcc-v,就可以得到生成的交叉編譯工具的版本,該文生成的版本為4.3.2,如圖2所示{classCClientSocketclientsocket;//監(jiān)聽套接字CStringclientaddress;//客戶端IP地址intclientright;//客戶端權限structclientlist*next;}CLIENTLIST;②PACKAGE這是一個用于交換信息的自定義數(shù)據(jù)包結構體,其定義如下:typedefenum{disconnect,message,response,closecomputer,filepackage,renamefile,removefile,downloadfile,uploadfile,renamedirectory,removedirectory,getdirectory,createdirectory}PACKAGESTYLE;typedefstruct{PACKAGESTYLEpackagestyle;//該枚舉類型用以表示本數(shù)據(jù)包包含信息的類型charsender[16];//數(shù)據(jù)包的發(fā)送方charreceiver[16];//數(shù)據(jù)包的接收方charpackagemessage[512];//數(shù)據(jù)包基本信息charpackageappendix[256];//數(shù)據(jù)包擴展信息ULONGLONGfilesize;//發(fā)送文件的長度UINTfileindex;//發(fā)送文件的編號,用于今后客戶端和服務器之間多文件通訊charfilecontent[5120];//文件數(shù)據(jù)包內(nèi)容}PACKAGE;圖2該方法總結:用crosstool-ng構建Linux操作系統(tǒng)下交叉編譯工具,腳本會自動完成Linux環(huán)境下頭文件、庫文件、內(nèi)核版本和交叉編譯工具鏈的匹配問題,方法簡單易行,也不容易出錯。由于其是一個開源軟件,目前仍在不斷維護過程中,如果遇到更高版本的Linux
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆高考英語讀后續(xù)寫說課稿 追車人
- 2025SRV汽化煙道熱噴涂合金防護層施工合同
- 2025民間融資合同范本
- 14《母雞》(說課稿)-2023-2024學年語文四年級下冊統(tǒng)編版
- 2025年駕校培訓合同范本
- 2025商品購銷合同(超市類)
- 2024年五年級數(shù)學下冊 一 圖形的運動(二)1.2畫對稱圖形說課稿 冀教版
- 2024-2025學年高中歷史 第一單元 第一次世界大戰(zhàn) 第2課 慘烈的四年戰(zhàn)事教學說課稿 岳麓版選修3
- 陶土板幕墻施工方案
- 游樂場植物墻施工方案
- 公務員2012年國考《申論》真題卷及答案(地市級)
- 新員工三級安全教育考試試題參考答案
- 35kV輸變電工程(變電站、輸配電線路建設)技術方案
- 數(shù)學史簡介課件可編輯全文
- 化學廢水水池清理施工方案
- 離婚協(xié)議書常用范本2024年
- 中學安全辦2024-2025學年工作計劃
- 2024年山東省東營市中考數(shù)學試題 (解析版)
- 2024年陜西西安亮麗電力集團有限責任公司招聘筆試沖刺題(帶答案解析)
- 2024年鄉(xiāng)村振興(產(chǎn)業(yè)、文化、生態(tài))等實施戰(zhàn)略知識考試題庫與答案
- 小學數(shù)學試題命制培訓
評論
0/150
提交評論