開發(fā)環(huán)境的搭建和開發(fā)工具課件_第1頁
開發(fā)環(huán)境的搭建和開發(fā)工具課件_第2頁
開發(fā)環(huán)境的搭建和開發(fā)工具課件_第3頁
開發(fā)環(huán)境的搭建和開發(fā)工具課件_第4頁
開發(fā)環(huán)境的搭建和開發(fā)工具課件_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Linux操作系統(tǒng)分析主講:陳香蘭助教:賈永泉、毛熠璐3606864-83(西區(qū)電三421)Autumn 2007xlanchen2007.5.221Embedded Operating Systems“工欲善其事, 必先利其器”-論語相關(guān)工具介紹開發(fā)工具分析工具GNU Tools簡介xlanchen2007.5.224Embedded Operating SystemsGNU toolsGNU tools和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件GCCBinutils輔助GCC的主要軟件Gdbmakecvs一、GCC很多人認為G

2、CC只是一個C編譯器,其實GCC = GNU Compiler Collection目前,GCC可以支持多種高級語言,如C、C+ADAObject CJAVAFortranPASCALGCC下的工具cpp 預(yù)處理器GNU C編譯器在編譯前自動使用cpp對用戶程序進行預(yù)處理gcc 符合ISO等標(biāo)準(zhǔn)的C編譯器g+ 基本符合ISO標(biāo)準(zhǔn)的C+編譯器gcj GCC的java前端gnat GCC的GNU ADA 95前端GNU Toolsgccgcc是一個強大的工具集合,它包含了預(yù)處理器、編譯器、匯編器、鏈接器等組件。它會在需要的時候調(diào)用其他組件。輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪

3、些組件。對于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對嵌入式系統(tǒng)級的軟件開發(fā)非常重要gcc使用舉例(1)源程序gcc使用舉例(2)編譯和運行編譯運行g(shù)cc的工作過程(1)如果使用-v選項,則可以看到許多被隱藏的信息gcc的編譯過程一般情況下,c程序的編譯過程為1、預(yù)處理2、編譯成匯編代碼3、匯編成目標(biāo)代碼4、鏈接1、預(yù)處理預(yù)處理:使用-E參數(shù)輸出文件的后綴為“.cpp”gcc E o gcctest.cpp gcctest.c使用wc命令比較預(yù)處理后的文件與源文件,可以看到兩個文件的差異行數(shù) 單詞數(shù) 字節(jié)數(shù)預(yù)編譯預(yù)處理文件匯編代碼1)使用-x參數(shù)說明根據(jù)指定的步驟進行工

4、作,cpp-output指明從預(yù)處理得到的文件開始編譯2)使用-S說明生成匯編代碼后停止工作gcc x cpp-output S o gcctest.s gcctest.cpp也可以直接編譯到匯編代碼gcc S gcctest.c2、編譯成匯編代碼預(yù)處理文件匯編代碼直接編譯到匯編代碼3、編譯成目標(biāo)代碼匯編代碼目標(biāo)代碼gcc x assembler c gcctest.s直接編譯成目標(biāo)代碼gcc c gcctest.c使用匯編器生成目標(biāo)代碼as o gcctest.o gcctest.s匯編代碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器4、編譯成執(zhí)行代碼目標(biāo)代碼執(zhí)行代碼gcc o gcctest gc

5、ctest.o直接生成執(zhí)行代碼gcc o gcctest gcctest.c目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼gcc的高級選項-Wall:打開所有的警告信息根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應(yīng)當(dāng)返回一個值修改源程序優(yōu)化編譯優(yōu)化編譯選項有:-O0缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化gcc的優(yōu)化編譯舉例(1)考慮如下的源代碼不同的優(yōu)化編譯選項gcc的優(yōu)化編譯舉例(2)使用time命令統(tǒng)計程序的運行二、GNU binutilsbinutils是一組二進制工具程序集,是輔助GCC的主要軟件,它主要包括addr2line 把程序地址轉(zhuǎn)換為文件名和行號。在命令行中

6、給它一個地址和一個可執(zhí)行文件名,它就會使用這個可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個文件以及行號。ar 建立、修改、提取歸檔文件。歸檔文件是包含多個文件內(nèi)容的一個大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始文件內(nèi)容。as 是GNU匯編器,主要用來編譯GNU C編譯器gcc輸出的匯編文件,他將匯編代碼轉(zhuǎn)換成二進制代碼,并存放到一個object文件中,該目標(biāo)文件將由連接器ld連接C+filt解碼C+符號名,連接器使用它來過濾 C+ 和 Java 符號,防止重載函數(shù)沖突。 gprof 顯示程序調(diào)用段的各種數(shù)據(jù)。ld 是連接器,它把一些目標(biāo)和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并鏈接符號引用,最終形成一個可執(zhí)行

7、文件。通常,建立一個新編譯程序的最后一步就是調(diào)用ld。nm 列出目標(biāo)文件中的符號。objcopy把一種目標(biāo)文件中的內(nèi)容復(fù)制到另一種類型的目標(biāo)文件中.objdump 顯示一個或者更多目標(biāo)文件的信息。使用選項來控制其顯示的信息。它所顯示的信息通常只有編寫編譯工具的人才感興趣。ranlib 產(chǎn)生歸檔文件索引,并將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標(biāo)文件。readelf 顯示ebf格式可執(zhí)行文件的信息。size 列出目標(biāo)文件每一段的大小以及總體的大小。默認情況下,對于每個目標(biāo)文件或者一個歸檔文件中的每個模塊只產(chǎn)生一行輸出。strings 打印某個文件的可打印字符串,

8、這些字符串最少4個字符長,也可以使用選項-n設(shè)置字符串的最小長度。默認情況下,它只打印目標(biāo)文件初始化和可加載段中的可打印字符;對于其它類型的文件它打印整個文件的可打印字符,這個程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。strip 丟棄目標(biāo)文件中的全部或者特定符號。 libiberty 包含許多GNU程序都會用到的函數(shù),這些程序有: getopt, obstack, strerror, strtol 和 strtoul.libbfd 二進制文件描述庫.libopcodes 用來處理opcodes的庫, 在生成一些應(yīng)用程序的時候也會用到它, 比如objdump.Opcodes是文本格式可讀的處理器操作

9、指令.binutils開發(fā)工具使用舉例arnmObjcopyObjdumpreadelf1、arar用于建立、修改、提取歸檔文件(archive),一個歸檔文件,是包含多個被包含文件的單個文件(也可以認為歸檔文件是一個庫文件)。被包含的原始文件的內(nèi)容、權(quán)限、時間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原使用ar建立庫文件(1)源程序add.c和minus.c使用ar建立庫文件(2)編譯成目標(biāo)文件將庫文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說明:r:將多個文件組成一個文件v:輸出信息建立庫文件庫文件使用舉例在代碼中使用Add和Minus函數(shù)在編譯時指定庫文件指明將libt

10、est.a鏈接進來運行結(jié)果2、nmnm的主要功能是列出目標(biāo)文件中的符號,這樣程序員就可以定位和分析執(zhí)行程序和目標(biāo)文件中的符號信息和它的屬性nm顯示的符號類型A:符號的值是絕對值,并且不會被將來的鏈接所改變B:符號位于未初始化數(shù)據(jù)部分(BSS段)C:符號是公共的。公共符號是未初始化的數(shù)據(jù)。在鏈接時,多個公共符號可能以相同的名字出現(xiàn)。如果符號在其他地方被定義,則該文件中的這個符號會被當(dāng)作引用來處理D:符號位于已初始化的數(shù)據(jù)部分T:符號位于代碼部分U:符號未被定義?:符號類型未知,或者目標(biāo)文件格式特殊nm使用舉例如果對test可執(zhí)行文件使用nm,會有什么結(jié)果呢?(作業(yè))3、objcopy可以將一種格

11、式的目標(biāo)文件內(nèi)容進行轉(zhuǎn)換,并輸出為另一種格式的目標(biāo)文件。它使用GNU BFD(binary format description)庫讀/寫目標(biāo)文件,通過這個BFD庫,objcopy能以一種不同于源目標(biāo)文件的格式生成新的目標(biāo)文件$objcopy -h在makefile里面用-O binary 選項來生成原始的二進制文件,即通常說的image文件Objcopy使用舉例使用file命令查看文件類型生成srec格式的目標(biāo)文件使用file命令查看新文件的類型文件格式a.out:assembler and link editor output 匯編器和鏈接編輯器的輸出 coffcommon object

12、file format一種通用的對象文件格式 ELFexcutive linked fileLinux系統(tǒng)所采用的一種通用文件格式,支持動態(tài)連接。ELF格式可以比COFF格式包含更多的調(diào)試信息 文件格式Flatelf格式有很大的文件頭,flat文件對文件頭和一些段信息做了簡化uClinux系統(tǒng)使用flat可執(zhí)行文件格式SRECMOTOROLA S-Recoder格式(S記錄格式文件) 等等4、objdump顯示一個或多個目標(biāo)文件的信息,由其選項來控制顯示哪些信息。一般來說,objdump只對那些要編寫編譯工具的程序員有幫助,但是我們通過這個工具可以方便的查看執(zhí)行文件或者庫文件的信息Objdum

13、p使用舉例(1)-f選項:顯示文件頭中的內(nèi)容Objdump使用舉例(2)-d選項進行反匯編5、readelfreadelf:顯示一個或多個ELF格式的目標(biāo)文件信息。Readelf使用舉例三、其他GNU工具Gdb調(diào)試器GNU make軟件工程工具diff,patch補丁工具CVS版本控制系統(tǒng)1、GNU Toolchaingdb Gdb = GNU debugerGNU tools中的調(diào)試器,功能強大設(shè)置斷點監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠程調(diào)試gdb使用舉例源代碼如下編譯:gcc o bug bug.c編譯并運行?編譯使用gdb調(diào)試bug運行bug輸入字符串hello顯示出錯

14、位置能不能看到源代碼呢?使用gcc的-g參數(shù)gcc g o bug bug.c重新調(diào)試列出源代碼?怎么修改前面的源代碼呢?設(shè)置斷點2、使用GNU make管理項目GNU make是一種代碼維護工具,在使用GNU編譯器開發(fā)大型應(yīng)用時,往往要使用make管理項目。如果不使用make管理項目,就必須重復(fù)使用多個復(fù)雜的命令行維護項目和生成目標(biāo)代碼。Make通過將命令行保存到makefile中簡化了編譯工作。Make的主要任務(wù)是根據(jù)makefile中定義的規(guī)則和步驟,根據(jù)各個模塊的更新情況,自動完成整個軟件項目的維護和代碼生成工作。Make可以識別出makefile中哪些文件已經(jīng)被修改,并且在再次編譯的

15、時候只編譯這些文件,從而提高編譯的效率Make會檢查文件的修改和生成時間戳,如果目標(biāo)文件的修改或者生成時間戳比它的任意一個依賴文件舊,則make就執(zhí)行makefile文件中描述的相應(yīng)命令,以便更新目的文件只更新那些需要更新的文件,而不重新處理那些并不過時的文件特點:適合于支持多文件構(gòu)成的大中型軟件項目的編譯,鏈接,清除中間文件等管理工作提供和識別多種默認規(guī)則,方便對大型軟件項目的管理支持對多目錄的軟件項目進行遞歸管理對軟件項目具有很好的可維護性和擴展性makefileMakefile告訴make該做什么、怎么做makefile主要定義了1)依賴關(guān)系即有關(guān)哪些文件的最新版本是依賴于哪些別的文件產(chǎn)

16、生或者組成的2)需要用什么命令來產(chǎn)生目標(biāo)文件的最新版本3)以及一些其他的功能Makefile的規(guī)則規(guī)則一條規(guī)則包含3個方面的內(nèi)容,1)要創(chuàng)建的目標(biāo)(文件),2)創(chuàng)建目標(biāo)(文件)所依賴的文件列表;3)通過依賴文件創(chuàng)建目標(biāo)文件的命令組規(guī)則一般形式target . : prerequisites . command . . 例如test:test.c;gcc O o test test.c一個簡單的makefileedit : main.o kbd.o command.o display.o insert.o search.o files.o utils.occ -o edit main.o kbd

17、.o command.o display.o insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : sear

18、ch.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o Make的工作過程default goal在缺省的情況下,make從makefile中的第一個目標(biāo)開始執(zhí)行Make的工作過程類似一次深度優(yōu)先遍歷過程Makefile 中的變量使用變

19、量可以降低錯誤風(fēng)險簡化makefile例:objects變量($(objects))objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects)cc -o edit $(objects) 有點像環(huán)境變量環(huán)境變量在make 過程中被解釋成make的變量可以被用來貯存一個文件名列表。貯存可執(zhí)行文件名。如用變量代替編譯器名。貯存編譯器FLAG預(yù)定義變量Make使用了許多預(yù)定義的變量,如ARASCCCXXCFLAGSCPPFLAGS等等簡化后的makefile文件objects

20、 = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects) cc -o edit $(objects)main.o : defs.h kbd.o : defs.h command.h command.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h util

21、s.o : defs.h .PHONY : clean clean : rm edit $(objects) 內(nèi)部變量$擴展成當(dāng)前規(guī)則的目的文件名$擴展成依賴列表中的第一個依賴文件$擴展成整個依賴列表(除掉了里面所有重復(fù)的文件名) 等等不需要括號括住例如:CC = gccCFLAGS = -Wall -O -g foo.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c $ -o $隱含規(guī)則 (Implicit Rules)內(nèi)置的規(guī)則告訴make當(dāng)沒有給出某些命令的時候,應(yīng)該怎么辦。用戶可以使用預(yù)定義的變量改變隱含規(guī)則的工作方式,如一個編譯的具體命令將會是:$(CC

22、) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $設(shè)定目標(biāo)(Phony Targets)設(shè)定目標(biāo)目標(biāo)不是一個文件其目的是為了讓一些命令得以執(zhí)行使用PHONY顯式聲明設(shè)定目標(biāo).PHONY: clean使用設(shè)定目標(biāo)實現(xiàn)多個目的all: prog1 prog2典型的設(shè)定目標(biāo)設(shè)定目的也可以用來描述一些其他的動作。例如,想把中間文件和可執(zhí)行文件刪除,可以在 makefile 里設(shè)立這樣一個規(guī)則:clean:$rm *.o exec_file前提是沒有其它的規(guī)則依靠這個 clean 目的,它將永遠不會被執(zhí)行。但是,如果你明確的使用命令 make clean ,

23、 make 會把這個目的做為它的主要目標(biāo),執(zhí)行那些 rm 命令Makefile中的函數(shù) (Functions)用來計算出要操作的文件、目標(biāo)或者要執(zhí)行的命令使用方法:$(function arguments)典型的函數(shù)$(subst from,to,text) $(subst ee,EE,feet on the street) 相當(dāng)于fEEt on the strEEt $(patsubst pattern,replacement,text)$(patsubst %.c,%.o,x.c.c bar.c) 相當(dāng)于x.c.o bar.o$(wildcard pattern) $(wildcard *

24、.c)objects := $(wildcard *.o) makefile中的條件語句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendif四種條件語句ifeq.else.endififneqelseendififndefelseendif ifndef.elseendif 實際項目中的makefile找到Linux源代碼中所有的makefile,分析它們的功能、相互關(guān)系。3、GNU Toolsldld,The GNU LinkerLinux上常用的鏈接器l

25、d軟件的作用是把各種目標(biāo)文件(.o文件)和庫文件鏈接在一起,并定位數(shù)據(jù)和函數(shù)地址,最終生成可執(zhí)行程序gcc可以間接的調(diào)用ld,使用gcc的-Wl參數(shù)可以傳遞參數(shù)給ld使用命令:ld -help可以列出ld常用的一些選項ld使用舉例(1)源程序編譯hello.c到hello.o命令:gcc -c hello.cld使用舉例(2)鏈接命令:ld dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o hello.o lc o hello運行./hello目標(biāo)文件ld通過BFD庫可以讀取和操作

26、coff、elf、a.out等各種執(zhí)行文件格式的目標(biāo)文件BFD(Binary File Descriptor)目標(biāo)文件(object file)由多個節(jié)(section)組成,常見的節(jié)有:text節(jié)保存了可執(zhí)行代碼,data節(jié)保存了有初值的全局標(biāo)量,bss節(jié)保存了無初值的全局變量。使用objdump查看目標(biāo)文件的信息objdump h hello.o比較hello 看看有什么不同?鏈接描述文件( Linker script )可以使用鏈接描述文件控制ld的鏈接過程。鏈接描述文件,command file又稱為鏈接腳本,Linker script用來控制ld的鏈接過程描述各輸入文件的各節(jié)如何映射到輸出文件的各節(jié)控制輸出文件中各個節(jié)或者符號的內(nèi)存布局使用的語言為:The ld command language,鏈接命令語言ld命令的-T commandfile選項指定了鏈接描述

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論