ARM-Linux交叉編譯環(huán)境完全手冊_第1頁
ARM-Linux交叉編譯環(huán)境完全手冊_第2頁
ARM-Linux交叉編譯環(huán)境完全手冊_第3頁
ARM-Linux交叉編譯環(huán)境完全手冊_第4頁
ARM-Linux交叉編譯環(huán)境完全手冊_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

河北工業(yè)大學(xué)城市學(xué)院2012屆本科畢業(yè)設(shè)計說明書PAGEPAGE24PAGE1畢業(yè)設(shè)計中文摘要ARM-Linux交叉編譯環(huán)境的創(chuàng)建摘要:交叉編譯就是在一個平臺生成可以在另一個平臺執(zhí)行的代碼,它作為嵌入式系統(tǒng)開發(fā)的前提和準(zhǔn)備,具有相當(dāng)重要的作用,嵌入式系統(tǒng)的可執(zhí)行文件都是通過交叉編譯生成的。本文詳細(xì)介紹了建立嵌入式交叉編譯環(huán)境的具體步驟,通過分步編譯Binutils、GCC、glibc和GDB,最終成功完成了基于ARM-Linux的交叉編譯環(huán)境的建立,并成功通過測試。在本設(shè)計中還列舉了用crosstool-ng構(gòu)建交叉編譯工具鏈的方法,這個方法比前一種簡單,而且比較快捷。這兩種方法制作的交叉編譯環(huán)境都具有高度的可靠性和穩(wěn)定性,并且具有較好的實用價值。關(guā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進(jìn)程控制類 92.1.6用戶帳號類 92.1.7網(wǎng)絡(luò)服務(wù) 92.2GCC包括的工具。 92.3交叉調(diào)試概念 103.分步編譯安裝源代碼與庫文件方法 113.1創(chuàng)建編譯環(huán)境 123.1.1首先設(shè)置環(huán)境變量: 123.1.2創(chuàng)建相關(guān)目錄 123.1.3安裝linux頭文件 123.2編譯binutils 133.3編譯bootstrap-gcc 143.4編譯Glibc 153.5編譯完整Gcc 173.6編譯GDB 174用crosstool-ng構(gòu)建交叉編譯工具鏈 194.1下載crosstool-ng 204.2安裝所必須的工具文件 204.3安裝crosstool-ng 204.4復(fù)制交叉編譯文件 204.5配置交叉編譯工具鏈 214.6編譯工具鏈 224.7增加環(huán)境變量 22結(jié)論 24參考文獻(xiàn) 25致謝 271引言1.1課題研究的目的意義嵌入式系統(tǒng)無疑是當(dāng)前最熱門最有發(fā)展前途的IT應(yīng)用領(lǐng)域之一。嵌入式系統(tǒng)用在一些特定專用設(shè)備上,通常這些設(shè)備的硬件資源(如處理器、存儲器等)非常有限,并且對成本很敏感,有時對實時響應(yīng)的要求很高等。特別是隨著消費(fèi)家電的智能化,嵌入式更顯重要。像我們平常常見到的手機(jī)、PDA、電子字典、可視電話、VCD/DVD/MP3Player、數(shù)字相機(jī)(DC)、數(shù)字?jǐn)z像機(jī)(DV)、U-Disk、機(jī)頂盒(SetTopBox)、高清電視(HDTV)、游戲機(jī)、智能玩具、交換機(jī)、路由器、數(shù)控設(shè)備或儀表、汽車電子、家電控制系統(tǒng)、醫(yī)療儀器、航天航空設(shè)備等等都是典型的嵌入式系統(tǒng)。伴隨著嵌入式產(chǎn)品的迅速發(fā)展,使得嵌入式軟件開發(fā)再度成為一個研究熱點。由于嵌入式設(shè)備的性能局限,往往不能通過本機(jī)編譯得到所需軟件的可執(zhí)行程序。因此,以Linux為主機(jī)操作系統(tǒng),搭配一個交叉編譯系統(tǒng),為嵌入式設(shè)備生成可執(zhí)行程序已成為現(xiàn)在日益流行的編譯嵌入式軟件的解決方案。而開放源碼的編譯器GCC,經(jīng)過多年的發(fā)展,已能支持幾乎所有知名廠商的處理器,是嵌入式軟件開發(fā)中理想的交叉編譯器。但現(xiàn)有GCC支持的平臺并不能滿足層出不窮的嵌入式產(chǎn)品的開發(fā)需要,仍有許多平臺得不到支持。隨著信息技術(shù)的發(fā)展,微型化和專業(yè)化成為信息產(chǎn)品發(fā)展的新趨勢,嵌入式產(chǎn)品成為信息產(chǎn)業(yè)的主流。而ARM技術(shù)的日益成熟和廣泛應(yīng)用,使得基于ARM核的微處理器已經(jīng)成為嵌入式市場的首選。建立面向ARM構(gòu)架的嵌入式操作系統(tǒng)也就成為當(dāng)前研究的熱點問題。在眾多的嵌入式操作系統(tǒng)中,許多開發(fā)人員都選擇Linux,主要是因為它是源碼公開而且是免費(fèi)的,可以讓任何人將其修改移植到自己的目標(biāo)平臺系統(tǒng)里使用。系統(tǒng)可以通過配置內(nèi)核,動態(tài)地加載和卸載內(nèi)核模塊機(jī)制,可以方便地在內(nèi)核中添加新的組件或卸載不再需要的內(nèi)核組件。交叉編譯環(huán)境是嵌入式開發(fā)必不可少的工具,在進(jìn)行項目開發(fā)的時候必須搭建一套開發(fā)環(huán)境,包括操作系統(tǒng)、連接器、編譯器及調(diào)試器在內(nèi)的軟件開法工具。交叉編譯的實現(xiàn)解決了嵌入式系統(tǒng)目標(biāo)平臺存儲空間和運(yùn)算能力有限的缺點,完善的工具鏈可以保證項目開發(fā)的進(jìn)度和質(zhì)量,是嵌入式開發(fā)的基礎(chǔ)。1.2課題歷史背景Linux是一種自由和開放源碼的類Unix操作系統(tǒng)。目前存在著許多不同的Linux,但它們都使用了Linux內(nèi)核。Linux可安裝在各種計算機(jī)硬件設(shè)備中,從手機(jī)、平板電腦、路由器和視頻游戲控制臺,到臺式計算機(jī)、大型機(jī)和超級計算機(jī)。Linux是一個領(lǐng)先的操作系統(tǒng),世界上運(yùn)算最快的10臺超級計算機(jī)運(yùn)行的都是Linux操作系統(tǒng)。嚴(yán)格來講,Linux這個詞本身只表示Linux內(nèi)核,但實際上人們已經(jīng)習(xí)慣了用Linux來形容整個基于Linux內(nèi)核,并且使用GNU工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。20世紀(jì)50年代,IBM的JohnBackus帶領(lǐng)一個研究小組對FORTRAN語言及其編譯器進(jìn)行開發(fā)。但由于當(dāng)時人們對編譯理論了解不多,開發(fā)工作變得既復(fù)雜又艱苦。與此同時,NoamChomsky開始了他對自然語言結(jié)構(gòu)的研究。他的發(fā)現(xiàn)最終使得編譯器的結(jié)構(gòu)異常簡單,甚至還帶有了一些自動化。Chomsky的研究導(dǎo)致了根據(jù)語言文法的難易程度以及識別它們所需要的算法來對語言分類。正如現(xiàn)在所稱的Chomsky架構(gòu)(ChomskyHierarchy),它包括了文法的四個層次:0型文法、1型文法、2型文法和3型文法,且其中的每一個都是其前者的特殊情況。2型文法(或上下文無關(guān)文法)被證明是程序設(shè)計語言中最有用的,而且今天它已代表著程序設(shè)計語言結(jié)構(gòu)的標(biāo)準(zhǔn)方式。分析問題(parsingproblem,用于上下文無關(guān)文法識別的有效算法)的研究是在60年代和70年代,它相當(dāng)完善的解決了這個問題?,F(xiàn)在它已是編譯原理中的一個標(biāo)準(zhǔn)部分。有限狀態(tài)自動機(jī)(FiniteAutomation)和正則表達(dá)式(RegularExpression)同上下文無關(guān)文法緊密相關(guān),它們與Chomsky的3型文法相對應(yīng)。對它們的研究與Chomsky的研究幾乎同時開始,并且引出了表示程序設(shè)計語言的單詞的符號方式。人們接著又深化了生成有效目標(biāo)代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常將其稱為優(yōu)化技術(shù)(OptimizationTechnique),但因其從未真正地得到過被優(yōu)化了的目標(biāo)代碼而僅僅改進(jìn)了它的有效性,因此實際上應(yīng)稱作代碼改進(jìn)技術(shù)(CodeImprovementTechnique)。當(dāng)分析問題變得好懂起來時,人們就在開發(fā)程序上花費(fèi)了很大的功夫來研究這一部分的編譯器自動構(gòu)造。這些程序最初被稱為編譯器的編譯器(Compiler-compiler),但更確切地應(yīng)稱為分析程序生成器(ParserGenerator),這是因為它們僅僅能夠自動處理編譯的一部分。這些程序中最著名的是Yacc(YetAnotherCompiler-compiler),它是由SteveJohnson在1975年為Unix系統(tǒng)編寫的。類似的,有限狀態(tài)自動機(jī)的研究也發(fā)展了一種稱為掃描程序生成器(ScannerGenerator)的工具,Lex(與Yacc同時,由MikeLesk為Unix系統(tǒng)開發(fā))是這其中的佼佼者。在20世紀(jì)70年代后期和80年代早期,大量的項目都貫注于編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試并未取得多少成功,這大概是因為操作太復(fù)雜而人們又對其不甚了解。編譯器設(shè)計最近的發(fā)展包括:首先,編譯器包括了更加復(fù)雜算法的應(yīng)用程序它用于推斷或簡化程序中的信息;這又與更為復(fù)雜的程序設(shè)計語言的發(fā)展結(jié)合在一起。其中典型的有用于函數(shù)語言編譯的Hindley-Milner類型檢查的統(tǒng)一算法。其次,編譯器已越來越成為基于窗口的交互開發(fā)環(huán)境(InteractiveDevelopmentEnvironment,IDE)的一部分,它包括了編輯器、連接程序、調(diào)試程序以及項目管理程序。這樣的IDE標(biāo)準(zhǔn)并沒有多少,但是對標(biāo)準(zhǔn)的窗口環(huán)境進(jìn)行開發(fā)已成為方向。另一方面,盡管近年來在編譯原理領(lǐng)域進(jìn)行了大量的研究,但是基本的編譯器設(shè)計原理在近20年中都沒有多大的改變,它現(xiàn)在正迅速地成為計算機(jī)科學(xué)課程中的中心環(huán)節(jié)。在20世紀(jì)90年代,作為GNU項目或其它開放源代碼項目標(biāo)一部分,許多免費(fèi)編譯器和編譯器開發(fā)工具被開發(fā)出來。這些工具可用來編譯所有的計算機(jī)程序語言。它們中的一些項目被認(rèn)為是高質(zhì)量的,而且對現(xiàn)代編譯理論感興趣的人可以很容易的得到它們的免費(fèi)源代碼。大約在1999年,SGI公布了他們的一個工業(yè)化的并行化優(yōu)化編譯器Pro64的源代碼,后被全世界多個編譯器研究小組用來做研究平臺,并命名為Open64。Open64的設(shè)計結(jié)構(gòu)好,分析優(yōu)化全面,是編譯器高級研究的理想平臺。在一種計算機(jī)環(huán)境中運(yùn)行的編譯程序,能編譯出在另外一種環(huán)境下運(yùn)行的代碼,我們就稱這種編譯器支持交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。這里需要注意的是所謂平臺,實際上包含兩個概念:體系結(jié)構(gòu)(Architecture)、操作系統(tǒng)(OperatingSystem)。同一個體系結(jié)構(gòu)可以運(yùn)行不同的操作系統(tǒng);同樣,同一個操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運(yùn)行。舉例來說,我們常說的x86Linux平臺實際上是Intelx86體系結(jié)構(gòu)和Linuxforx86操作系統(tǒng)的統(tǒng)稱;而x86WinNT平臺實際上是Intelx86體系結(jié)構(gòu)和WindowsNTforx86操作系統(tǒng)的簡稱。有時是因為目的平臺上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特征;有時是因為目的平臺上的資源貧乏,無法運(yùn)行我們所需要編譯器;有時又是因為目的平臺還沒有建立,連操作系統(tǒng)都沒有,根本談不上運(yùn)行什么編譯器。交叉編譯這個概念的出現(xiàn)和流行是和嵌入式系統(tǒng)的廣泛發(fā)展同步的。我們常用的計算機(jī)軟件,都需要通過編譯的方式,把使用高級計算機(jī)語言編寫的代碼(比如C代碼)編譯(compile)成計算機(jī)可以識別和執(zhí)行的二進(jìn)制代碼。比如,我們在Windows平臺上,可使用VisualC++開發(fā)環(huán)境,編寫程序并編譯成可執(zhí)行程序。這種方式下,我們使用PC平臺上的Windows工具開發(fā)針對Windows本身的可執(zhí)行程序,這種編譯過程稱為nativecompilation,中文可理解為本機(jī)編譯。然而,在進(jìn)行嵌入式系統(tǒng)的開發(fā)時,運(yùn)行程序的目標(biāo)平臺通常具有有限的存儲空間和運(yùn)算能力,比如常見的ARM平臺,其一般的靜態(tài)存儲空間大概是16到32MB,而CPU的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺上進(jìn)行本機(jī)編譯就不太可能了,這是因為一般的編譯工具鏈(compilationtoolchain)需要很大的存儲空間,并需要很強(qiáng)的CPU運(yùn)算能力。為了解決這個問題,交叉編譯工具就應(yīng)運(yùn)而生了。通過交叉編譯工具,我們就可以在CPU能力很強(qiáng)、存儲控件足夠的主機(jī)平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序。交叉編譯就是在一個平臺上通過編譯器編譯某個源程序,生成的可執(zhí)行代碼在另一個平臺上也能運(yùn)行。經(jīng)典的交叉編譯是指在PC機(jī)上編譯出能在嵌入式目標(biāo)機(jī)上運(yùn)行的可執(zhí)行代碼。因為嵌入式的目標(biāo)主機(jī)硬件資源有限,不能獨(dú)立自主的完成程序的編譯工作,從另外一個角度,嵌入式主機(jī)上運(yùn)行的程序調(diào)試穩(wěn)定后,基本不需要修改,也沒有必要具備完成自身程序的編譯工作。因此,在嵌入式系統(tǒng)開發(fā)時,常常由宿主機(jī)開發(fā)程序,目標(biāo)機(jī)作為執(zhí)行機(jī)。兩者在開發(fā)時需要時時交替結(jié)合進(jìn)行。一般把編譯程序的主機(jī)稱為宿主機(jī)(Host),把運(yùn)行程序的嵌入式主機(jī)稱為目標(biāo)機(jī)(Target)。為了使宿主機(jī)上開發(fā)的程序(應(yīng)用程序和驅(qū)動程序)能夠方便地下載到目標(biāo)機(jī)上運(yùn)行,一般還要在宿主機(jī)上配置好網(wǎng)絡(luò),使其支持NFS或tftp等網(wǎng)絡(luò)服務(wù),從而實現(xiàn)兩臺機(jī)器之間的文件共享。交叉編譯環(huán)境一般由交叉編譯器、交叉連接器和C程序庫glibc等一系列的交叉工具集組成。這些交叉工具通過配置二進(jìn)制工具Binutils包來產(chǎn)生。通?;贏RM的Linux交叉編譯器為arm-linux-gcc、交叉連接器arm-linux-ld。1.3開發(fā)方案的選擇Linux環(huán)境模式選擇:嵌入式Linux操作系統(tǒng)是交叉編譯環(huán)境搭建的重要基礎(chǔ),只有有了操作系統(tǒng)的支持,整個系統(tǒng)才能有條不紊的進(jìn)行。Linux開發(fā)環(huán)境方案有以下幾種:Windows+Linux+目標(biāo)系統(tǒng):安裝多個操作系統(tǒng)只需一臺計算機(jī),但是在調(diào)試應(yīng)用程序時需要在兩個系統(tǒng)之間進(jìn)行切換,會比較麻煩和費(fèi)時;Windows+Cygwin+目標(biāo)系統(tǒng):Cygwin是一個模擬Linux環(huán)境軟件,此模式具有快速省時的優(yōu)點,但并不能真實的模擬Linux,且系統(tǒng)穩(wěn)定性差;Windows+Vmware虛擬機(jī)(Linux)+目標(biāo)系統(tǒng):Vmware可以在不破壞原有操作系統(tǒng)的基礎(chǔ)上,虛擬出一臺真實的計算機(jī)出來,只需要在這臺虛擬計算機(jī)上安裝Linux,其效果和真實Linux系統(tǒng)完全一樣。我選擇的是第三種方法,這種方法可能會編譯的慢些,但是方便與網(wǎng)絡(luò)的互聯(lián),與Windows下的文件共享也方便,一邊在虛擬機(jī)上調(diào)試方法,一邊在Windows上查閱資料,一臺電腦可以當(dāng)兩臺用,確實很方便。通過安裝crosstool-ng,復(fù)制交叉編譯文件,配置交叉編譯工具鏈,編譯工具鏈,增加環(huán)境變量,最終制作出適合需要的交叉編譯工具。2了解嵌入式開發(fā)2.1Linux常用命令2.1.1文件目錄類1)mkdir目錄名 建立目錄2)rmdir目錄名 刪除空目錄3)rm-rf目錄名 無條件刪除子目錄4)cd目錄名 改變當(dāng)前目錄(進(jìn)入用戶home目錄:cd~;進(jìn)入上一級目錄:cd..)5)pwd 查看自己所在目錄6)du 查看當(dāng)前目錄大小7)ls–l 顯示目錄文件列表(-a:增加顯示隱含目錄)其中:藍(lán):目錄;綠:可執(zhí)行文件;紅:壓縮文件;淺藍(lán):鏈接文件;灰:其他文件;紅底白字:錯誤的鏈接文件8)cat文件名 瀏覽文件9)cp源文件目標(biāo)文件 復(fù)制文件(-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進(jìn)程控制類1)ps-auxw 列出當(dāng)前進(jìn)程ID;2)kill進(jìn)程ID號 終止單一進(jìn)程;3)Killall程序名 終止該程序所有進(jìn)程;4)xkill 終止X-Window程序;5)top 查看資源占用情況;6)env 查看環(huán)境變量的值;7)reboot 重啟;8)shutdown-hnow 關(guān)機(jī);2.1.6用戶帳號類1)增加用戶帳號: 用戶名:adduser帳號名2)設(shè)置密碼: passwd帳號名3)刪除用戶帳號: userdel帳號名4)增加用戶組: groupadd用戶組名5)刪除用戶組: groupdel用戶組名6)暫時終止用戶帳號:passwd-l帳號名7)恢復(fù)被終止帳號: passwd-u帳號名2.1.7網(wǎng)絡(luò)服務(wù)1)ifconfig 顯示網(wǎng)絡(luò)接口的參數(shù)2)mail 顯示系統(tǒng)的郵件3)httpd-kstart|stop 啟動或終止web服務(wù)4)pingxxx.xxx.xxx.xxx 查看網(wǎng)絡(luò)狀況,聯(lián)機(jī)狀況:ping[-dfnqrRv][-c<完成次數(shù)>][-i<間隔秒數(shù)>][-l<前置載入>][-p<范本樣式>][-s<數(shù)據(jù)包大小>][-t<存活數(shù)值>][主機(jī)名稱或IP地址]2.2GCC包括的工具。1)cppGNU預(yù)處理器,主要用于擴(kuò)展用戶源程序的頭文件和宏定義。cpp是GNUC編譯器的預(yù)處理器。cpp是一個宏指令處理器,GNUC編譯器在編譯前自動使用cpp對用戶程序進(jìn)行轉(zhuǎn)換。cpp之所以稱為宏指令處理器是因為它允許用戶定義宏指令(長結(jié)構(gòu)的簡寫)。2)GCC符合ISO等標(biāo)準(zhǔn)的C編譯器。3)g++基本符合ISO等標(biāo)準(zhǔn)的C++編譯器。4)Binutils是一組二進(jìn)制工具程序集,它包括addr2line、ar、as、gprof、ld、nm、objcopy、objdump、ranlib、size、strings、strip等工具。是輔助GCC的主要軟件。5)AsGNU匯編器(Assemble),主要用于把匯編代碼轉(zhuǎn)換成二進(jìn)制代碼,并存放到一個object文件中。6)LdGNU鏈接器(Linker),主要用于確定相對地址,把多個object文件、起始(Startup)代碼段、庫(Library)等鏈接起來,并最終形成一個可執(zhí)行文件。7)Addr2line把可執(zhí)行程序中的地址映射到源文件的對應(yīng)行。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ā)嵌入式應(yīng)用軟件時,交叉調(diào)試是必不可少的一步。嵌入式應(yīng)用的特點決定了其調(diào)試具有如下的特點:1)調(diào)試器(Debugger)和被調(diào)試程序(Debuggee)運(yùn)行在不同的計算機(jī)上。Debugger運(yùn)行在一般的PC機(jī)或者工作站上(即Host上),而Debuggee運(yùn)行在實際的某種嵌入式設(shè)備或者專業(yè)的評估板上(都被稱為Target)。2)Debugger通過某種通信方式與目標(biāo)機(jī)建立聯(lián)系。通信方式可以是串口、并口、網(wǎng)絡(luò)、或者專用的通信方式。3)一般在目標(biāo)機(jī)上有Debugger的某種代理(Agent),這種代理能與Debugge一起配合完成對目標(biāo)機(jī)上運(yùn)行的程序的調(diào)試。這種代理可以是某種軟件,也可以是某種支持調(diào)試的硬件等。4)目標(biāo)機(jī)也可以是一種虛擬機(jī)。在這種情形下,似乎Debugger和Debuggee運(yùn)行在了同一臺計算機(jī)。但是調(diào)試方式的本質(zhì)沒有變化,即Debuggee都是被下載到了目標(biāo)機(jī),對Debuggee的調(diào)試并不是直接通過Host的操作系統(tǒng)的調(diào)試支持來完成的,而是通過虛擬機(jī)代理的方式來完成調(diào)試。3.分步編譯安裝源代碼與庫文件方法交叉編譯使用的軟件包如下表1整個編譯過程的步驟:⑴創(chuàng)建編譯環(huán)境。在該這過程中,將設(shè)置必須的環(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首先設(shè)置環(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)建相關(guān)目錄#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)建相關(guān)鏈接。#cdlinux$VLinuxKERNEL/include/asm-arm#rm–farchproc#ln–sarch–s3c2410arch#ln–sarch–s3c2410arch#ln–sproc–armvproc#cd../../3.2編譯binutils首先要安裝的軟件包是binutils,這步非常重要,Glibc和gcc會針對可用的連接器和匯編器進(jìn)行多種測試,來決定打開某些特性。解壓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目錄下保存了二進(jìn)制文件,即ar、as、ld、nm、ranlib、和strip幾個文件。Lib目錄下有l(wèi)dscripts子目錄,里邊存放了一些腳本文件。/bin目錄下存放生成的二進(jìn)制工具,這些文件是用語ELF執(zhí)行格式的,前綴使用arm-linux。/lib目錄下存放了libiberty.a庫文件。3.3編譯bootstrap-gcc創(chuàng)建交叉編譯版本的gcc,需要交叉編譯版本的Glibc及頭文件,而交叉編譯版本的Glibc是通過交叉編譯版本的gcc創(chuàng)建的。先編譯對c語言的支持,并禁止支持線程。編譯gcc之前需要進(jìn)行修改,首先修改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運(yùn)行庫。glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運(yùn)行庫都會依賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務(wù)外,它本身也提供了許多其它一些必要功能服務(wù)的實現(xiàn)。由于glibc囊括了幾乎所有的

UNIX

通行的標(biāo)準(zhǔn),可以想見其內(nèi)容包羅萬有。而就像其他的UNIX系統(tǒng)一樣,其內(nèi)含的檔案群分散于系統(tǒng)的樹狀目錄結(jié)構(gòu)中,像一個支架一般撐起整個作業(yè)系統(tǒng)。在GNU/Linux系統(tǒng)中,其C函式庫發(fā)展史點出了GNU/Linux演進(jìn)的幾個重要里程碑,用glibc作為系統(tǒng)的C函式庫,是GNU/Linux演進(jìn)的一個重要里程碑。創(chuàng)建Glibc需要的時間很長,也容易出錯。之前創(chuàng)建了arm-linux-gcc,arm-linux-ar和arm-linux-ranlib等工具。在編譯Glibc前,還要進(jìn)行一些修改。#cd$SDIR#tarxvfz$TDIR/glibc-$VGLIBC.tar.gz#cd$SDIR/glibc-$VGLIBC#rm–rfnptl#tarxvfz$TDIR/glibc-linuxthreads-$VGLIBCTHREADS.tar.gz源代碼準(zhǔn)備好后,修改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時添加進(jìn)去的,當(dāng)時是為了繞過一些檢查。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是一款非常強(qiáng)大的調(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目錄結(jié)構(gòu)目錄名內(nèi)容Arm-linux和target相關(guān)的文件Bin交叉開發(fā)工具集Include頭文件InfoGcc的info文件Lib庫文件Man幫助文檔Share交叉開發(fā)工具和庫文件共享的文件表2arm-linux目錄結(jié)構(gòu)目錄名內(nèi)容Bin和glibc相關(guān)的target二進(jìn)制文件和腳本Etc這里只有rpc文件Include頭文件InfoGlibc的info文件LibTarget的庫文件Libexec這里只有pt_chownSbinTarget中的/sbin目錄Share和國際化相關(guān)的子目錄,文件Sys-include這里存放glibc沒有安裝的頭文件,由gcc腳本復(fù)制4.1下載crosstool-ngcrosstool-ng的下載地址為/download/crosstool-ng,目前最高版本為1.9.3。需要注意的是,在下載完crosstool-ng之后,需要在http:///download/crosstool-ng/01-fixes/中查看一下是否有相應(yīng)版本的補(bǔ)丁,如果有就一并下載下來。4.2安裝所必須的工具文件用crosstool-ng構(gòu)建交叉編譯環(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文件進(jìn)行解壓,筆者解壓的目錄為/home/crosstool-ng,解壓好的文件夾為crosstool-ng-1.9.3。如果存在補(bǔ)丁文件,則需要在此目錄中運(yùn)行patch-p1<"補(bǔ)丁文件"之后在crosstool-ng文件夾下新建install安裝目錄并在終端中執(zhí)行:1)配置sudo./configure–prefix=/home/crosstool-ng/install2)編譯sudomake3)安裝sudomakeinstall4.4復(fù)制交叉編譯文件生成交叉編譯工具之前,需要準(zhǔn)備配置文件??梢詮?fù)制對于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配置交叉編譯工具鏈復(fù)制好構(gòu)建交叉編譯工具所需的配置文件之后,還需對其進(jìn)行環(huán)境設(shè)置。進(jìn)入安裝目錄cd/home/crosstool-ng/install/bin,執(zhí)行sudo./ct-ngmenuconfig1)下載編譯所需源碼包并設(shè)置路徑在隨后的編譯過程中,需要一系列的軟件包,程序在執(zhí)行過程中如果在本地磁盤找不到這些軟件包,會自動去網(wǎng)上下載,但是會放慢整個編譯過程。通過查看crosstool/install/bin目錄下的.config文件,可以得知所必需的軟件包。通過預(yù)先下載這些軟件包并存放在本地磁盤上,可以大大加快編譯速度。具體的軟件在此不具體列出,讀者可以自行分析。在該文中在crosstool下新建目錄src并將下載下來的軟件包存放于此。修改源碼包的下載路徑,在該文中修改為/home/crosstool-ng/src2)修改交叉編輯安裝路徑交叉編譯器的安裝位置,在該文中修改為/home/crosstool-ng/build3)修改交叉編譯體系對于ARM處理器來說,由于其不同的體系結(jié)構(gòu)、地址空間和指令位數(shù),因此在編譯器上并不相同。對于S3C2410/S3C2440處理器芯片來說,核心是arm920t;而對于S3C6410來說,用的是armv6的框架,因此需要選擇armv6。對于不同的處理器芯片,首先查詢芯片手冊得到其處理器結(jié)構(gòu)框架。該文以S3C2440為例,在Targetoptions>下,進(jìn)行如下選擇:(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)一些個性化設(shè)置在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)歷軟件包解壓,配置,編譯,鏈接,大概需要兩個小時之后,如果沒有提示錯誤,就可以得到相應(yīng)的工具鏈了。4.7增加環(huán)境變量環(huán)境變量是一個具有特定名字的對象,它包含了一個或者多個應(yīng)用程序所將使用到的信息。例如path,當(dāng)要求系統(tǒng)運(yùn)行一個程序而沒有告訴它程序所在的完整路徑時,系統(tǒng)除了在當(dāng)前目錄下面尋找此程序外,還應(yīng)到path中指定的路徑去找。用戶通過設(shè)置環(huán)境變量,來更好的運(yùn)行進(jì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;//客戶端權(quán)限structclientlist*next;}CLIENTLIST;②PACKAGE這是一個用于交換信息的自定義數(shù)據(jù)包結(jié)構(gòu)體,其定義如下: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ù)包擴(kuò)展信息ULONGLONGfilesize;//發(fā)送文件的長度UINTfileindex;//發(fā)送文件的編號,用于今后客戶端和服務(wù)器之間多文件通訊charfilecontent[5120];//文件數(shù)據(jù)包內(nèi)容}PACKAGE;圖2該方法總結(jié):用crosstool-ng構(gòu)建Linux操作系統(tǒng)下交叉編譯工具,腳本會自動完成Linux環(huán)境下頭文件、庫文件、內(nèi)核版本和交叉編譯工具鏈的匹配問題,方法簡單易行,也不容易出錯。由于其是一個開源軟件,目前仍在不斷維護(hù)過程中,如果遇到更高版本的Linux

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論