实验模组名称.docx
- 文档编号:2436962
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:13
- 大小:116.48KB
实验模组名称.docx
《实验模组名称.docx》由会员分享,可在线阅读,更多相关《实验模组名称.docx(13页珍藏版)》请在冰点文库上搜索。
实验模组名称
實驗模組名稱
建構crosscompiler,assembler&linker
實驗目的(150字以內)
●充分瞭解在嵌入式系統的開發過程中,為什麼需要使用crosscompiler、assembler與linker、Cstandardlibrary
●如何建構crosscompiler、assembler與linker
●如何建構支援crosscompiler之Cstandardlibrary
實驗器材
●PCx1
⏹Requirement:
LinuxOSinstalled、nativegcccompilerinstalled、Internetaccess
實驗所需軟體
●GNUbinutilssourcecode(binutils-2.14.tar.bz2),sourcecodecangetfrom
⏹ftp:
//ftp.gnu.org/gnu/binutils/binutils-2.14.tar.bz2
●GNUC/C++compiler(gcc-3.2.3.tar.bz2),sourcecodecangetfrom
⏹ftp:
//ftp.gnu.org/gnu/gcc/gcc-3.3/gcc-3.2.3.tar.bz2
●GNUglibc(glibc-2.2.5.tar.gz),sourcecodecangetfrom
⏹ftp:
//ftp.gnu.org/gnu/glibc/glibc-2.2.5.tar.gz
TableofContents
TableofContents2
Part1–IntroductiontoGNUC/C++compilerandbinutils3
Step1:
understandGNUbinutils3
Step2:
understandGNUC/C++compiler(GCC)4
Step3:
crosstoolchains(crosssystem-developmenttools)5
Step4:
crossnewlib5
Part2–Buildcrossbinutils6
Step1:
downloadsourcecodeofGNUbinutils6
Step2:
uncompresssourcecode6
Step3:
configurebinutils7
Step4:
compilebinutils8
Step5:
installbinutils8
Step6:
測試crossbinutils是否編譯成功8
Part3–Buildcrosscompiler10
Step1:
AddbinutilstoPATH10
Step2:
downloadsourcecodeofGNUgcc10
Step3:
uncompresssourcecode11
Step4:
configuregcc11
Step5:
compilegcc12
Step6:
installgcc14
Step7:
測試所編譯之crosscompiler是否成功14
Part4–Buildcrossnewlib16
Step1:
Addbinutils、gcctoPATH16
Step2:
downloadsourcecodeofGNUnewlib16
Step3:
uncompresssourcecode16
Step4:
configurenewlib17
Step5:
compilenewlib18
Step6:
installnewlib18
Step7:
測試crossnewlib(crossCstandardlibrary)是否編譯成功19
Part1–IntroductiontoGNUC/C++compilerandbinutils
由於嵌入式系統處理器生命週期短、程式碼高效能的需求,使得相關軟體開發工具在嵌入式系統這個領域逐漸扮演關鍵性的角色,要有完整的開發環境,協力廠商或使用者才願意為你開發相關的應用程式或使用你的系統,能快速的提供完整的發展環境,才能佔有市場,搶得先機。
軟體開發工具包含了:
compiler、assembler、linker、debugger與相關的函式庫,由於發展軟體開發工具的成本非常高,廠商往往花費鉅資購買編譯器和發展環境,有時還必須付出一筆可觀的權利金。
近年來由於OpenSource和FreeSoftware概念的興起,許多重要的軟體以OpenSource的方式出現,使用者可以自由的修改、散佈和使用該軟體,其中最著名的應為GNUgroup所發展的軟體套件,這些軟體都是GPLLicense(你可以修改、散佈、使用或酌量收取費用,但是必須開放其原始碼)。
Step1:
understandGNUbinutils
TheGNUBinutils為一群binarytools的集合.主要的程式為:
-ld-theGNUlinker.
-as-theGNUassembler.
其他的程式還包含:
-addr2line-Convertsaddressesintofilenamesandlinenumbers.
-ar-Autilityforcreating,modifyingandextractingfromarchives.
-c++filt-FiltertodemangleencodedC++symbols.
-gprof-Displaysprofilinginformation.
-nlmconv-ConvertsobjectcodeintoanNLM.
-nm-Listssymbolsfromobjectfiles.
-objcopy-Copysandtranslatesobjectfiles.
-objdump-Displaysinformationfromobjectfiles.
-ranlib-Generatesanindextothecontentsofanarchive.
-readelf-DisplaysinformationfromanyELFformatobjectfile.
-size-Liststhesectionsizesofanobjectorarchivefile.
-strings-Listsprintablestringsfromfiles.
-strip-Discardssymbols.
-windres-AcompilerforWindowsresourcefiles.
這些操作於binaryformat的程式大部分使用BFD(BinaryFileDescriptorlibrary)來處理低階的檔案格式的操作,使用opcodeslibrary來處理組譯與反組譯的相關事宜。
Binutils已經被移植到許多不同的硬體平台上,它同時也具有易於移植到其他平台的特性,因此,非常適合用於嵌入式系統的開發。
Step2:
understandGNUC/C++compiler(GCC)
GNU有許多成名之作,其中最重要的軟體之一就是GCC,GCC最早由RichardStallman所發展,因為它是免費使用且原始碼公開,所以發展的相當迅速,很快就有許多人將它移植到不同的平台上。
GCC廣受歡迎的另一個原因是它所編譯出來的程式碼的品質(程式碼的正確性、大小、執行速度等等)並不比一些其他的商用編譯器來的差,有時甚至比較好,因此常常看到許多平台上都有GCC的蹤影。
GCC提供一套方便的機制,使你可以很容易的將它移植到另一個平台,同時也可以利用它來做為其他語言的前端,到目前為止,它所支援的程式語言有C、C++、ObjectiveC、Fortran、Java、Pascal、Ada、Modula-3、Java等等。
選擇GCC來開發compiler,是因為它免費可以取得,同時又支援許多平台和處理器,它結構化的設計使得我們可以很容易將它移植到另一個平台上,符合我們快速產生目的程式碼的需求,下圖顯示GCC的內部架構。
在GCC的編譯過程中,Parsing負責分析輸入的原始程式產生Parsingtree,透過Treetraveling產生中間碼RTL(registertransferlanguage),接著GCC讀取MachineDescription利用patternmatch的方式去matchRTL藉此產生assemblercode,在此過程中,GCC會使用不同的最佳化方法去最佳化RTL和產生assemblercode。
Step3:
crosstoolchains(crosssystem-developmenttools)
由於嵌入式系統先天上的限制(有限的記憶體大小、處理器的效能、系統可能沒有螢幕顯示相關訊息等等),在嵌入式系統內執行compiler、assembler等開發工具有時是不可能的。
因此,軟體開發工具必須能提供跨平台編譯的功能,才能符合實際的需求。
Crosstoolchains有幾個專有名詞,必須瞭解:
-Buildmachine:
themachinebuildscrosstoolchains
-Hostmachine:
themachinecrosstoolchainswillexecuteon
-Targetmachine:
themachinecrosstoolchainswillproduceoutputsfor
GNUtoolchains使用三個欄位(CPUtype–Companyname–Systemtype)來設定machine:
-CPUtype
-Companyname
-Systemtype
-Forexample:
vax-dec-ultrix4.2、i386-redhat-linux、m68k-coff、arm-elf
Step4:
crossglibc
在撰寫程式的過程中,通常都會使用Cstandardlibrary,GNUnewlibproject提供了適用於嵌入式系統的Cstandardlibrary,讓整個發展環境更為完整。
Part2–Buildcrossbinutils
設定安裝目錄
#INSTDIR=/usr/local/arm/3.3
#DESTDIR=/home/thu/toolchain/install
取得binutilstarball
#wgetftp:
//ftp.gnu.org/gnu/binutils/binutils-2.14.tar.bz2
解壓縮binutilstarball
#tar–jxvfbinutils-2.14.tar.bz2
patchbinutils
#cp/home/thu/patch-files/binutils-2.14.patch.bz2
#bzcatbinutils-2.14.patch.bz2|patch-p1-E-dbinutils-2.14
建立build目錄
#mkdirbinutils-2.14/build
#cdbinutils-2.14/build
設定binutils
#CFLAGS=-O2
#CXXFLAGS=-O2
#../configure--target=arm-linux--prefix=${INSTDIR}
這個步驟將偵測目前系統與相關軟體的狀態,調整相關的參數,最後產生適當的Makefile。
--target=arm-linux參數設定targetmachine為arm,支援的fileformat為linux
--prefix=${INSTDIR}參數設定軟體將安裝於${INSTDIR}目錄下。
建立binutils
#make
安裝binutils
#makeDESTDIR=${DESTDIR}install
#PATH=${DESTDIR}${INSTDIR}/bin:
$PATH
目錄結構如下:
測試crossbinutils是否編譯成功
測試crossas是否可執行:
#arm-linux-as–version
GNUldversion2.1420030612
Copyright2002
FreeSoftwareFoundation,Inc.
Thisprogramisfreesoftware;youmayredistributeitunderthetermsof
theGNUGeneralPublicLicense.Thisprogramhasabsolutelynowarranty.
Thisassemblerwasconfiguredforatargetof`arm-elf'.
測試crosslinker是否可執行:
#arm-linux-ld–version
GNUldversion2.1420030612
Copyright2002FreeSoftwareFoundation,Inc.
Thisprogramisfreesoftware;youmayredistributeitunderthetermsof
theGNUGeneralPublicLicense.Thisprogramhasabsolutelynowarranty.
Part3–Buildcrosscompiler
取得gcctarball
#wgetftp:
//ftp.gnu.org/gnu/gcc/gcc-3.3/gcc-3.3.tar.bz2
解壓縮gcctarball
#tar-vxjfgcc-3.3.tar.bz2
patchgcc
#cp/home/thu/patch-files/gcc-3.3.patch.bz2.
#bzcatgcc-3.3.patch.bz2|patch-p1-E-dgcc-3.3
建立linuxheaders
#cp/home/thu/patch-files/linux-2.4.21-header.bz2.
#tar–jvxflinux-2.4.21-header.bz2
#HEADERS=/home/thu/toolchain/linux-2.4.21/include
建立build目錄
#mkdirgcc-3.3/build
#cdgcc-3.3/build
設定gcc
#../configure--target=arm-linux\
--prefix=${INSTDIR}\
--with-headers=${HEADERS}\
--disable-shared\
--disable-threads\
--disable-debug\
--enable-languages="c"
-這個步驟將偵測目前系統與相關軟體的狀態,調整相關的參數,最後產生適當的Makefile。
---target=arm-linux參數設定targetmachine為arm。
---prefix=/foo參數設定軟體將安裝於/foo目錄下。
---enable-languages=c參數設定前端只支援C,即只產生C的編譯器。
(這部分我們為了節省編譯的時間,因此只建構C編譯器,同學也可以使用--enable-languages=c,c++參數設定建構C與C++編譯器)
建立gcc
#makeDESTDIR=${DESTDIR}build_tooldir=${DESTDIR}${INSTDIR}/arm-linux
安裝gcc
#makeDESTDIR=${DESTDIR}install
目錄結構如下:
(與binutils相同)
測試所編譯之crosscompiler是否成功
#arm-linux-gcc–Stest.c
我們所建構之crosscompilerarm-elf-gcc將test.c編譯成ARM組合語言test.S
Part4–Buildcrossnewlib
取得glibctarball
#wgetftp:
//ftp.gnu.org/gnu/glibc/glibc-2.2.5.tar.gz
取得glibc-linuxthreads
#wgetftp:
//ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.5.tar.gz
解壓縮binutilstarball
#tar-vxzfglibc-2.2.5.tar.gz
#tar-Cglibc-2.2.5-vxzfglibc-linuxthreads-2.2.5.tar.gz
patchbinutils
#cp/home/thu/patch-files/glibc-2.2.5.patch.bz2.
#bzcatglibc-2.2.5.patch.bz2|patch-p1-E-dglibc-2.2.5
建立build目錄
#mkdirglibc-2.2.5/build
#cdglibc-2.2.5/build
設定binutils
../configurearm-linux\
--build=i686-pc-linux-gnu\
--with-headers=${HEADERS}\
--enable-add-ons\
--enable-shared\
--prefix=${INSTDIR}
-這個步驟將偵測目前系統與相關軟體的狀態,調整相關的參數,最後產生適當的Makefile。
-prefix=/foo參數設定軟體將安裝於/foo目錄下。
(與binutils、gcc相同)
建立binutils
#make
安裝binutils
#makeinstall_root=${DESTDIR}install
目錄結構如下:
(與binutils、gcc皆相同)
測試crossglibc(crossCstandardlibrary)是否編譯成功
測試crossnewlib是否可執行:
#arm-linux-gcc–Stest1.c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 模组 名称