ARM交叉編譯鏈的制作_第1頁
ARM交叉編譯鏈的制作_第2頁
ARM交叉編譯鏈的制作_第3頁
ARM交叉編譯鏈的制作_第4頁
ARM交叉編譯鏈的制作_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、ARM交叉編譯鏈的制作 這種做法操作很簡單,但是不能根據自己的需求去定義,只能選擇已經編譯好的東西。2. 自己動手利用crosstool來制作。 A. 在CROSSTOOL官方網站下載源碼包,解壓,進入解壓后的目錄。 $cd crosstool-0.42 B. 以ROOT建立目錄,存放生成的交叉編譯鏈 改變該目錄的 所有者為普通用戶 例如,存放生成的交叉編譯鏈目錄為/opt/crosstool,如下所示: sudo mkdir /opt/crosstool sudo chown $USER /opt/crosstool C. 修改針對目標板的腳本文件。 $sudo vi demo-arm.sh

2、 (1)這幾個環(huán)境變量可以根據實際情況修改 TARBALLS_DIR=$HOME/downloads RESULT_TOP=/opt/crosstool export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c+" export GCC_LANGUAGES D. 修改目標板腳本文件demo-arm.sh中eval那一行出現(xiàn)的體系結構的配置文件 $sudo vi arm.dat KERNELCONFIG=pwd/arm.config TARGET=arm-unknown-linux-gnu TARGET_CFLAGS="-O

3、" 可以修改TARGET變量為 TARGET=arm-S3C2410-linux-gnu(你的arm型號) E.修改目標板腳本文件demo-arm.sh中eval那一行出現(xiàn)的工具鏈的匹配文件 BINUTILS_DIR=binutils-2.15 以上變量要根據實際情況修改。不過 GDB_DIR=gdb-6.0 F.以普通用戶運行腳本 $sudo sh demo-arm.sh 進入漫長的等待過程中3. 安裝完成后路徑設置和測試。,改完后我的是這樣的 # User specific environment and startup programs PATH=$PATH:$HOME/bin

4、 export PATH unset USERNAME 然后就好了??梢蚤_始測試使用了。測試的方法很簡單,隨便找個程序源碼編譯一下就好了。這里用的這些編譯器生成的是二進制文件,和平時的gcc生成的可執(zhí)行文件并不相同。例如我測試時的文件是test.c, #include<stdio.h> int main() printf("Hello!"); return 0; 調用新的arm-linux-gcc來編譯:arm-S3C2410-linux-gnu-gcc -o test test.c,這時生成的test文件是一個二進制的可執(zhí)行文件,并不是我們平時常用的,所以在P

5、C上執(zhí)行這個文件的話是不行的,系統(tǒng)會提示:bash: ./test: cannot execute binary file。所以不能用這種方法來測試交叉編譯是否成功。而應改采用file命令,例如我的是這樣的: file test 結果如下: 如果出現(xiàn)這樣的結果說明交叉編譯環(huán)境已經安裝成功。否則重新想辦法吧 第二種方法中,gcc,gdb等文件的下載方法有兩種,一是設置好網絡后讓shell程序自己去下載,這種方法簡單,但是下載速度不敢恭維。另外一種是自己使用下載工具去下載,然后將存放路徑告訴demo-arm.sh,即 2.C里面的內容。這種方法速度讓人滿意。推薦使用。建立ARM交叉編譯環(huán)境 (ar

6、m-none-linux-gnueabi-gcc with EABI)2011-03-24 11:00昨天終于把交叉編譯環(huán)境、移植內核和制作root文件系統(tǒng)在arm開發(fā)板上順利跑通了。期間有的步驟很順利,但更多的是被諸多問題困擾,比如最后一個不起眼的小問題導致文件系統(tǒng)無法加載,郁悶了我一個星期,最終通過分析慢慢發(fā)現(xiàn)了這個bug。還有各源碼包版本的問題,而且網上很多介紹都是基于舊版本的。我這里全部用最新或較新的版本,當然,至于新舊版本到底哪個更好更合適,這是個智者見智的論題,不在本文討論之列。我堅信很多人也遇到過或者即將遇到我曾經歷過的錯誤和問題,因此我覺得把我過去兩周做過的相關工作,詳細地寫下

7、來,希望對大家有所幫助! 首先是平臺和環(huán)境 ,我過去兩周都是基于vmware 中ubuntu 10.04的,但是我發(fā)現(xiàn)ubuntu這個很火的桌面linux發(fā)行版本并不適合進行嵌入式開發(fā),典型的麻煩就是系統(tǒng)缺少很多庫、服務等等,需要自己手動安裝,增加了不少額外的工作,和我以前用的SuSe 9比麻煩不少。不過所以現(xiàn)在我干脆全新裝了一個SUSE 11.2 Enterprise Server 32bit,把過去的工作重復一遍,邊編譯邊紀錄,力求不遺漏細節(jié)! 過程預覽:1,準備工作,包括下載源碼包、補丁、建立文件夾和設置環(huán)境變量等2,建立內核頭文件3,建立binutils4,建立bootstrap gc

8、c5,建立glibc6,建立完整版本gcc7,測試hello world 現(xiàn)在就讓我們開始吧! 1 準備工作 我使用的源碼包和補丁 如下:至于怎么得到這些源碼包,找google吧! 建立工作目錄 自己選一個合適的地方,建立一個總文件夾Embedded,并且在其下建立 build-tools、kernel和tools三個子文件夾、我們以后的操作就都在這里進行了。$ mkdir Embedded$ cd Embedded$ mkdir build-tools kernel tool$ lsbuild-tools kernel tool 各文件夾作用如下:build-tools : 保存binuti

9、ls、gcc 和 glibc的源代碼和用來編譯這些源代碼的目錄。kernel : 保存內核源代碼和補丁。tools : 保存編譯好的交叉編譯工具和庫文件。然后在build-tools文件夾中建立如下子文件夾:$ cd build-tools $ mkdir build-binutils build-boot-gcc build-glibc build-gcc build-binutils :編譯binutils的目錄build-boot-gcc : 編譯gcc 啟動部分的目錄build-glibc :編譯glibc的目錄build-gcc :編譯完整gcc的目錄 設置環(huán)境變量: 這里設置環(huán)境變

10、量只是為了方便,因為每個工具的config都需要輸入類似的變量,不如放在環(huán)境變量里。在命令行下打開vi /.bashrc,在文檔最后輸入下面幾行,然后注銷當前用戶,重新登錄export PRJROOT=/home/jinglelong/MySoftware/Embeddedexport TARGET=arm-none-linux-gnueabiexport PREFIX=$PRJROOT/toolsexport TARGET_PREFIX=$PREFIX/$TARGETexport PATH=$PREFIX/bin:$PATH各變量的具體意義如下:PRJROOT : 整個工程的根目錄,這里當然

11、是Embeded了TARGET : 目標文件對應的體系結構,arm-linux代表編譯出來的target只能在arm體系結構中運行PREFIX : 設置目標文件夾的路徑前綴TARGET_PREFIX : 設置目標文件夾的路徑前綴路徑PATH : 添加可執(zhí)行文件的路徑,這里主要是只中間編譯工具等2 建立內核include文件 編譯生成version頭文件 這個是編譯glibc時必須的,使用命令:make include/linux/version.h3 建立binutils 解壓binutils源碼到文件夾: $PRJROOT/build-tools/binutils-2.20配置:cd $PR

12、JROOT/build-tools/build-binutils$ ./binutils-2.20/configure -target=$TARGET -prefix=$PREFIX 編譯:make出錯:././binutils-2.20/gas/config/tc-arm.c: In function make_mapping_symbol:././binutils-2.20/gas/config/tc-arm.c:2489: error: suggest braces around empty body in an if statement打開文件binutils-2.20/gas/con

13、fig/tc-arm.c,把2490行的語句,用一對大括號括起來就可以了安裝: make install完成后檢查一下$PREFIX文件夾,是不是多了三個子文件夾,bin, lib, share? 打開bin,發(fā)現(xiàn)里面生成了14個可執(zhí)行文件: rootlocalhost bin# lsarm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-objdump arm-none-lin

14、ux-gnueabi-readelf arm-none-linux-gnueabi-strings arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-c+filt arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-ranlib arm-none-linux-gnueabi-size arm-none-linux-gnueabi-strip他們的功能分別是:add2line :將你要找的地址轉成文件和行號,它要使用 debug 信息。ar

15、:產生、修改和解開一個存檔文件as :gnu的匯編器c+filt :C+ 和 java 中有一種重載函數(shù),所用的重載函數(shù)最后會被編譯轉化成匯編的標,c+filt 就是實現(xiàn)這種反向的轉化,根據標號得到函數(shù)名。gprof :gnu 匯編器預編譯器。ld :gnu 的連接器nm :列出目標文件的符號和對應的地址objcopy :將某種格式的目標文件轉化成另外格式的目標文件objdump :顯示目標文件的信息ranlib :為一個存檔文件產生一個索引,并將這個索引存入存檔文件中readelf :顯示 elf 格式的目標文件的信息size :顯示目標文件各個節(jié)的大小和目標文件的大小strings :打印

16、出目標文件中可以打印的字符串,有個默認的長度,為4strip :剝掉目標文件的所有的符號信息 4 建立bootstrap gcc 首先,我們?yōu)槭裁匆ootstrap gcc,而不能一次性成功?原因有兩點:一是由于平臺本身的gcc編譯器和我們要建立的gcc版本不同,第一次用平臺本身的編譯器去build目標版本的gcc編譯器的時候,新生成的目標編譯器(相當于初始編譯器編譯鏈接生成的可執(zhí)行文件)必然帶有初始編譯器的特征。而當我們用新生成的編譯器再次編譯自身時,便可去掉這種差異性。二是因為gcc編譯器依賴于glibc,而當前我們的glibc是基于本機的,所以我們首先要build基于arm體系結構

17、的glibc,再在glibc的基礎上生成基于arm體系結構的gcc。這一步是最容易出錯的,對每一步都必須謹慎,不要犯粗心之類的低級錯誤。解壓源碼解壓gcc源碼到build-tool文件夾下 修改源碼:CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC -Dinhibit_libc -D_gthr_posix_h確保本機已經安裝了mpc, mpfr, gmp, 如果沒有,則在yast里面安裝好再往后走。配置: 編譯:make all-gcc安裝gcc: make install 再編譯安裝libgcc,這個是后面編譯glibc必須的。編譯:make

18、all-target-libgcc安裝libgcc: make install-target-libgcc 我看到網上很多文章在這一步有很多錯誤,一種是直接用make命令編譯gcc下所有內容,這個是沒有必要的,而且容易出錯。我在ubuntu和suse下都無法完成編譯,而在fedora下通過了;第二種情況是沒有編譯libgcc,這會導致后面編譯glibc無法通過。 安裝完成后,在$PREFIX/bin下又多了幾個文件,arm-none-linux-gnueabi-cpp : gnu的 C 的預編譯器arm-none-linux-gnueabi-gcc : gnu的 C 語言編譯器arm-none

19、-linux-gnueabi-gccbug : 一個可執(zhí)行腳本,具體作用未知。arm-none-linux-gnueabi-gcov : gcc 的輔助測試工具,用來分析和優(yōu)化程序 5 建立glibc 解壓源碼: 進入文件夾build-glibc,創(chuàng)建config.cache文件,并且在文件中輸入以下內容libc_cv_forced_unwind=yeslibc_cv_c_cleanup=yeslibc_cv_arm_tls=yes 配置:BUILD_CC="gcc" CC=$TARGET-gcc ./glibc-2.11/configure -host=$TARGET -target=$TARGET -prefix=/usr -enable-add-ons -disable-profile -cache-file=config.cache -with-binutils=$PREFIX/bin/ -with-headers=$TARGET_PREFIX/include/編譯:make出錯:/arm-linux/b

溫馨提示

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

評論

0/150

提交評論