嵌入式操作系統(tǒng)課件_第1頁
嵌入式操作系統(tǒng)課件_第2頁
嵌入式操作系統(tǒng)課件_第3頁
嵌入式操作系統(tǒng)課件_第4頁
嵌入式操作系統(tǒng)課件_第5頁
已閱讀5頁,還剩213頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式操作系統(tǒng)陳香蘭xlanchen@助教:陳博、李春華嵌入式操作系統(tǒng)陳香蘭GNU開發(fā)工具鏈介紹

“工欲善其事,必先利其器”--《論語》GNU開發(fā)工具鏈介紹 主要內(nèi)容GNUTools簡介GNUTools交叉開發(fā)環(huán)境及其安裝12/12/20223EmbeddedOperatingSystems主要內(nèi)容GNUTools簡介12/11/20223Embe本地開發(fā)vs交叉平臺開發(fā)本地開發(fā):

一般軟件的開發(fā)屬于本地開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)是相同的。交叉平臺開發(fā):

本課程所涉及到的嵌入式系統(tǒng)開發(fā)屬于交叉平臺開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)不同。12/12/20224EmbeddedOperatingSystems本地開發(fā)vs交叉平臺開發(fā)本地開發(fā):

一般軟件的開發(fā)屬于本交叉開發(fā)平臺主機:

開發(fā)軟件的平臺,稱為主機,往往是通用電腦;目標機:

運行軟件的平臺,稱為目標機,在這里是嵌入式系統(tǒng)。12/12/20225EmbeddedOperatingSystems交叉開發(fā)平臺主機:

開發(fā)軟件的平臺,稱為主機,往往是通用電腦嵌入式交叉開發(fā)工具掌握嵌入式開發(fā)工具的使用是進行嵌入式開發(fā)的前提條件之一與主流開發(fā)工具類似,嵌入式交叉開發(fā)工具也包括編譯器,即能夠把一個源程序編譯生成一個可執(zhí)行程序的軟件調(diào)試工具,即能夠?qū)?zhí)行程序進行源碼或匯編級調(diào)試的軟件軟件工程工具,用于協(xié)助多人開發(fā)或大型軟件項目的管理的軟件12/12/20226EmbeddedOperatingSystems嵌入式交叉開發(fā)工具掌握嵌入式開發(fā)工具的使用是進行嵌入式開發(fā)的GNUtoolsGNUtools和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件GCCBinutils—輔助GCC的主要軟件Gdbmakecvs12/12/20227EmbeddedOperatingSystemsGNUtoolsGNUtools和其他一些優(yōu)秀的開源軟件一、GCC很多人認為GCC只是一個C編譯器,

其實GCC=GNUCompilerCollection目前,GCC可以支持多種高級語言,如C、C++ADAObjectCJAVAFortranPASCAL12/12/20228EmbeddedOperatingSystems一、GCC很多人認為GCC只是一個C編譯器,

其實GCC=GCC下的工具cpp—預處理器

GNUC編譯器在編譯前自動使用cpp對用戶程序進行預處理gcc—符合ISO等標準的C編譯器g++—基本符合ISO標準的C++編譯器gcj—GCC的java前端gnat—GCC的GNUADA95前端12/12/20229EmbeddedOperatingSystemsGCC下的工具cpp—預處理器

GNUC編譯器在編譯前GNUTools—gccgcc是一個強大的工具集合,它包含了預處理器、編譯器、匯編器、鏈接器等組件。它會在需要的時候調(diào)用其他組件。

輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。對于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對嵌入式系統(tǒng)級的軟件開發(fā)非常重要12/12/202210EmbeddedOperatingSystemsGNUTools—gccgcc是一個強大的工具集合,它包含gcc使用舉例(1)

源程序12/12/202211EmbeddedOperatingSystemsgcc使用舉例(1)

源程序12/11/202211Embegcc使用舉例(2)

編譯和運行編譯運行12/12/202212EmbeddedOperatingSystemsgcc使用舉例(2)

編譯和運行編譯運行12/11/2022gcc的工作過程(1)如果使用-v選項,則可以看到許多被隱藏的信息12/12/202213EmbeddedOperatingSystemsgcc的工作過程(1)如果使用-v選項,則可以看到許多被隱藏12/12/202214EmbeddedOperatingSystems12/11/202214EmbeddedOperatinggcc的編譯過程一般情況下,c程序的編譯過程為1、預處理2、編譯成匯編代碼3、匯編成目標代碼4、鏈接12/12/202215EmbeddedOperatingSystemsgcc的編譯過程一般情況下,c程序的編譯過程為12/11/21、預處理預處理:使用-E參數(shù)

輸出文件的后綴為“.cpp” gcc–E–ogcctest.cppgcctest.c使用wc命令比較預處理后的文件與源文件,可以看到兩個文件的差異12/12/202216EmbeddedOperatingSystems1、預處理預處理:使用-E參數(shù)

輸出文件的后綴為“.cpp”行數(shù)單詞數(shù)字節(jié)數(shù)預編譯12/12/202217EmbeddedOperatingSystems行數(shù)單詞數(shù)字節(jié)數(shù)預編譯12/11/202217Embed預處理文件匯編代碼

1)使用-x參數(shù)說明根據(jù)指定的步驟進行工作,cpp-output指明從預處理得到的文件開始編譯

2)使用-S說明生成匯編代碼后停止工作gcc–xcpp-output–S–ogcctest.sgcctest.cpp也可以直接編譯到匯編代碼 gcc–Sgcctest.c2、編譯成匯編代碼12/12/202218EmbeddedOperatingSystems預處理文件匯編代碼

1)使用-x參數(shù)說明根據(jù)指定的步驟進行預處理文件匯編代碼直接編譯到匯編代碼s12/12/202219EmbeddedOperatingSystems預處理文件匯編代碼直接編譯到匯編代碼s12/11/20223、編譯成目標代碼匯編代碼目標代碼 gcc–xassembler–cgcctest.s直接編譯成目標代碼 gcc–cgcctest.c使用匯編器生成目標代碼as–ogcctest.ogcctest.s12/12/202220EmbeddedOperatingSystems3、編譯成目標代碼匯編代碼目標代碼12/11/202220匯編代碼目標代碼直接編譯成目標代碼使用匯編器12/12/202221EmbeddedOperatingSystems匯編代碼目標代碼直接編譯成目標代碼使用匯編器12/11/24、編譯成執(zhí)行代碼目標代碼執(zhí)行代碼 gcc–ogcctestgcctest.o直接生成執(zhí)行代碼 gcc–ogcctestgcctest.c12/12/202222EmbeddedOperatingSystems4、編譯成執(zhí)行代碼目標代碼執(zhí)行代碼12/11/202222目標代碼執(zhí)行代碼直接生成執(zhí)行代碼12/12/202223EmbeddedOperatingSystems目標代碼執(zhí)行代碼直接生成執(zhí)行代碼12/11/202223Egcc的高級選項-Wall:打開所有的警告信息12/12/202224EmbeddedOperatingSystemsgcc的高級選項-Wall:打開所有的警告信息12/11/2根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應當返回一個值12/12/202225EmbeddedOperatingSystems根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末修改源程序12/12/202226EmbeddedOperatingSystems修改源程序12/11/202226EmbeddedOper優(yōu)化編譯優(yōu)化編譯選項有:-O0

缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化12/12/202227EmbeddedOperatingSystems優(yōu)化編譯優(yōu)化編譯選項有:不同程度的優(yōu)化12/11/20222gcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化編譯選項12/12/202228EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化12/gcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計程序的運行12/12/202229EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計程序的運行1二、GNUbinutilsbinutils是一組二進制工具程序集,是輔助GCC的主要軟件,它主要包括addr2line把程序地址轉(zhuǎn)換為文件名和行號。在命令行中給它一個地址和一個可執(zhí)行文件名,它就會使用這個可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個文件以及行號。ar建立、修改、提取歸檔文件。歸檔文件是包含多個文件內(nèi)容的一個大文件,其結(jié)構(gòu)保證了可以恢復原始文件內(nèi)容。12/12/202230EmbeddedOperatingSystems二、GNUbinutilsbinutils是一組二進制工具as是GNU匯編器,主要用來編譯GNUC編譯器gcc輸出的匯編文件,他將匯編代碼轉(zhuǎn)換成二進制代碼,并存放到一個object文件中,該目標文件將由連接器ld連接C++filt解碼C++符號名,連接器使用它來過濾C++和Java符號,防止重載函數(shù)沖突。gprof顯示程序調(diào)用段的各種數(shù)據(jù)。ld是連接器,它把一些目標和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并鏈接符號引用,最終形成一個可執(zhí)行文件。通常,建立一個新編譯程序的最后一步就是調(diào)用ld。12/12/202231EmbeddedOperatingSystemsas是GNU匯編器,主要用來編譯GNUC編譯器gcc輸出nm列出目標文件中的符號。objcopy把一種目標文件中的內(nèi)容復制到另一種類型的目標文件中.objdump顯示一個或者更多目標文件的信息。使用選項來控制其顯示的信息。它所顯示的信息通常只有編寫編譯工具的人才感興趣。ranlib產(chǎn)生歸檔文件索引,并將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。readelf顯示elf格式可執(zhí)行文件的信息。12/12/202232EmbeddedOperatingSystemsnm列出目標文件中的符號。12/11/202232Embesize列出目標文件每一段的大小以及總體的大小。默認情況下,對于每個目標文件或者一個歸檔文件中的每個模塊只產(chǎn)生一行輸出。strings打印某個文件的可打印字符串,這些字符串最少4個字符長,也可以使用選項-n設置字符串的最小長度。默認情況下,它只打印目標文件初始化和可加載段中的可打印字符;對于其它類型的文件它打印整個文件的可打印字符,這個程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。strip丟棄目標文件中的全部或者特定符號。12/12/202233EmbeddedOperatingSystemssize列出目標文件每一段的大小以及總體的大小。默認情況下libiberty包含許多GNU程序都會用到的函數(shù),這些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd二進制文件描述庫.libopcodes用來處理opcodes的庫,在生成一些應用程序的時候也會用到它,比如objdump.Opcodes是文本格式可讀的處理器操作指令.12/12/202234EmbeddedOperatingSystemslibiberty包含許多GNU程序都會用到的函數(shù),這些binutils開發(fā)工具使用舉例arnmObjcopyObjdumpreadelf12/12/202235EmbeddedOperatingSystemsbinutils開發(fā)工具使用舉例ar12/11/2022351、arar用于建立、修改、提取歸檔文件(archive),一個歸檔文件,是包含多個被包含文件的單個文件(也可以認為歸檔文件是一個庫文件)。被包含的原始文件的內(nèi)容、權(quán)限、時間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原12/12/202236EmbeddedOperatingSystems1、arar用于建立、修改、提取歸檔文件(archive),使用ar建立庫文件(1)源程序add.c和minus.c12/12/202237EmbeddedOperatingSystems使用ar建立庫文件(1)源程序add.c和minus.c12使用ar建立庫文件(2)編譯成目標文件將庫文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說明: r:將多個文件組成一個文件 v:輸出信息建立庫文件12/12/202238EmbeddedOperatingSystems使用ar建立庫文件(2)編譯成目標文件將庫文件拷貝到/usr庫文件使用舉例

在代碼中使用Add和Minus函數(shù)12/12/202239EmbeddedOperatingSystems庫文件使用舉例

在代碼中使用Add和Minus函數(shù)12/11在編譯時指定庫文件指明將libtest.a鏈接進來運行結(jié)果12/12/202240EmbeddedOperatingSystems在編譯時指定庫文件指明將libtest.a鏈接進來運行結(jié)果12、nmnm的主要功能是列出目標文件中的符號,這樣程序員就可以定位和分析執(zhí)行程序和目標文件中的符號信息和它的屬性12/12/202241EmbeddedOperatingSystems2、nmnm的主要功能是列出目標文件中的符號,這樣程序員就可nm顯示的符號類型A:符號的值是絕對值,并且不會被將來的鏈接所改變B:符號位于未初始化數(shù)據(jù)部分(BSS段)C:符號是公共的。公共符號是未初始化的數(shù)據(jù)。在鏈接時,多個公共符號可能以相同的名字出現(xiàn)。如果符號在其他地方被定義,則該文件中的這個符號會被當作引用來處理D:符號位于已初始化的數(shù)據(jù)部分T:符號位于代碼部分U:符號未被定義?:符號類型未知,或者目標文件格式特殊 12/12/202242EmbeddedOperatingSystemsnm顯示的符號類型A:符號的值是絕對值,并且不會被將來的鏈接nm使用舉例如果對test可執(zhí)行文件使用nm,會有什么結(jié)果呢?(作業(yè))12/12/202243EmbeddedOperatingSystemsnm使用舉例如果對test可執(zhí)行文件使用nm,12/11/23、objcopy可以將一種格式的目標文件內(nèi)容進行轉(zhuǎn)換,并輸出為另一種格式的目標文件。它使用GNUBFD(binaryformatdescription)庫讀/寫目標文件,通過這個BFD庫,objcopy能以一種不同于源目標文件的格式生成新的目標文件$objcopy-h在makefile里面用-Obinary選項來生成原始的二進制文件,即通常說的image文件12/12/202244EmbeddedOperatingSystems3、objcopy可以將一種格式的目標文件內(nèi)容進行轉(zhuǎn)換,并輸Objcopy使用舉例使用file命令查看文件類型生成srec格式的目標文件使用file命令查看新文件的類型12/12/202245EmbeddedOperatingSystemsObjcopy使用舉例使用file命令查看文件類型生成sre文件格式a.out:

assemblerandlinkeditoroutput

匯編器和鏈接編輯器的輸出coff

commonobjectfileformat

一種通用的對象文件格式ELF

excutivelinkedfile

Linux系統(tǒng)所采用的一種通用文件格式,支持動態(tài)連接。ELF格式可以比COFF格式包含更多的調(diào)試信息12/12/202246EmbeddedOperatingSystems文件格式a.out:

assemblerandlink文件格式Flat

elf格式有很大的文件頭,flat文件對文件頭和一些段信息做了簡化

uClinux系統(tǒng)使用flat可執(zhí)行文件格式SREC

MOTOROLAS-Recoder格式(S記錄格式文件)等等12/12/202247EmbeddedOperatingSystems文件格式Flat

elf格式有很大的文件頭,flat文件對文4、objdump顯示一個或多個目標文件的信息,由其選項來控制顯示哪些信息。一般來說,objdump只對那些要編寫編譯工具的程序員有幫助,但是我們通過這個工具可以方便的查看執(zhí)行文件或者庫文件的信息12/12/202248EmbeddedOperatingSystems4、objdump顯示一個或多個目標文件的信息,由其選項來控Objdump使用舉例(1)-f選項:顯示文件頭中的內(nèi)容12/12/202249EmbeddedOperatingSystemsObjdump使用舉例(1)-f選項:顯示文件頭中的內(nèi)容12Objdump使用舉例(2)-d選項進行反匯編12/12/202250EmbeddedOperatingSystemsObjdump使用舉例(2)-d選項進行反匯編12/11/25、readelfreadelf:

顯示一個或多個ELF格式的目標文件信息。12/12/202251EmbeddedOperatingSystems5、readelfreadelf:

顯示一個或多個ELF格式Readelf使用舉例12/12/202252EmbeddedOperatingSystemsReadelf使用舉例12/11/202252Embedde三、其他GNU工具Gdb—調(diào)試器GNUmake--軟件工程工具diff,patch--補丁工具CVS--版本控制系統(tǒng)12/12/202253EmbeddedOperatingSystems三、其他GNU工具Gdb—調(diào)試器12/11/202253Em1、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的調(diào)試器,功能強大設置斷點監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠程調(diào)試12/12/202254EmbeddedOperatingSystems1、GNUToolchain—gdbGdb=GNUgdb使用舉例源代碼如下編譯:gcc–obugbug.c12/12/202255EmbeddedOperatingSystemsgdb使用舉例源代碼如下編譯:12/11/202255Emb編譯并運行????編譯12/12/202256EmbeddedOperatingSystems編譯并運行????編譯12/11/202256Embedde使用gdb調(diào)試bug

運行bug輸入字符串hello顯示出錯位置能不能看到源代碼呢?12/12/202257EmbeddedOperatingSystems使用gdb調(diào)試bug

運行bug輸入字符串hello顯示出錯使用gcc的-g參數(shù)gcc–g–obugbug.c重新調(diào)試列出源代碼12/12/202258EmbeddedOperatingSystems使用gcc的-g參數(shù)gcc–g–obugbug.c列?怎么修改前面的源代碼呢?設置斷點12/12/202259EmbeddedOperatingSystems?怎么修改前面的源代碼呢?設置斷點12/11/202259E2、使用GNUmake管理項目GNUmake是一種代碼維護工具,在使用GNU編譯器開發(fā)大型應用時,往往要使用make管理項目。如果不使用make管理項目,就必須重復使用多個復雜的命令行維護項目和生成目標代碼。Make通過將命令行保存到makefile中簡化了編譯工作。Make的主要任務是根據(jù)makefile中定義的規(guī)則和步驟,根據(jù)各個模塊的更新情況,自動完成整個軟件項目的維護和代碼生成工作。12/12/202260EmbeddedOperatingSystems2、使用GNUmake管理項目GNUmake是一種代碼維Make可以識別出makefile中哪些文件已經(jīng)被修改,并且在再次編譯的時候只編譯這些文件,從而提高編譯的效率Make會檢查文件的修改和生成時間戳,如果目標文件的修改或者生成時間戳比它的任意一個依賴文件舊,則make就執(zhí)行makefile文件中描述的相應命令,以便更新目的文件只更新那些需要更新的文件,而不重新處理那些并不過時的文件12/12/202261EmbeddedOperatingSystemsMake可以識別出makefile中哪些文件已經(jīng)被修改,并且特點:適合于支持多文件構(gòu)成的大中型軟件項目的編譯,鏈接,清除中間文件等管理工作提供和識別多種默認規(guī)則,方便對大型軟件項目的管理支持對多目錄的軟件項目進行遞歸管理對軟件項目具有很好的可維護性和擴展性12/12/202262EmbeddedOperatingSystems特點:12/11/202262EmbeddedOperatmakefileMakefile告訴make該做什么、怎么做makefile主要定義了1)依賴關(guān)系

即有關(guān)哪些文件的最新版本是依賴于哪些別的文件產(chǎn)生或者組成的2)需要用什么命令來產(chǎn)生目標文件的最新版本3)以及一些其他的功能12/12/202263EmbeddedOperatingSystemsmakefileMakefile告訴make該做什么、怎么做Makefile的規(guī)則規(guī)則

一條規(guī)則包含3個方面的內(nèi)容,1)要創(chuàng)建的目標(文件),2)創(chuàng)建目標(文件)所依賴的文件列表;3)通過依賴文件創(chuàng)建目標文件的命令組12/12/202264EmbeddedOperatingSystemsMakefile的規(guī)則規(guī)則

一條規(guī)則包含3個方面的內(nèi)容,12規(guī)則一般形式target...:prerequisites...<tab>command

<tab>...<tab>...例如test:test.c;gcc–O–otesttest.c12/12/202265EmbeddedOperatingSystems規(guī)則一般形式12/11/202265EmbeddedOpe一個簡單的makefile

edit:main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.occ-oeditmain.okbd.ocommand.odisplay.oinsert.o\ search.ofiles.outils.omain.o:main.cdefs.hcc-cmain.ckbd.o:kbd.cdefs.hcommand.hcc-ckbd.ccommand.o:command.cdefs.hcommand.hcc-ccommand.cdisplay.o:display.cdefs.hbuffer.hcc-cdisplay.cinsert.o:insert.cdefs.hbuffer.hcc-cinsert.csearch.o:search.cdefs.hbuffer.hcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hcc-cfiles.cutils.o:utils.cdefs.hcc-cutils.cclean: rmeditmain.okbd.ocommand.odisplay.oinsert.o\ search.ofiles.outils.o12/12/202266EmbeddedOperatingSystems一個簡單的makefile

edit:main.okbMake的工作過程defaultgoal

在缺省的情況下,make從makefile中的第一個目標開始執(zhí)行Make的工作過程類似一次深度優(yōu)先遍歷過程12/12/202267EmbeddedOperatingSystemsMake的工作過程defaultgoal

在缺省的情況下,Makefile中的變量使用變量可以降低錯誤風險簡化makefile例:objects變量($(objects))objects=main.okbd.ocommand.o\ display.oinsert.osearch.ofiles.outils.oedit:$(objects) cc-oedit$(objects)12/12/202268EmbeddedOperatingSystemsMakefile中的變量使用變量可以12/11/20226有點像環(huán)境變量環(huán)境變量在make過程中被解釋成make的變量可以被用來貯存一個文件名列表。貯存可執(zhí)行文件名。如用變量代替編譯器名。貯存編譯器FLAG12/12/202269EmbeddedOperatingSystems有點像環(huán)境變量12/11/202269EmbeddedOp預定義變量Make使用了許多預定義的變量,如ARASCCCXXCFLAGSCPPFLAGS等等12/12/202270EmbeddedOperatingSystems預定義變量Make使用了許多預定義的變量,如12/11/20簡化后的makefile文件

objects=main.okbd.ocommand.odisplay.o\insert.osearch.ofiles.outils.oedit:$(objects)cc-oedit$(objects)main.o:defs.hkbd.o:defs.hcommand.hcommand.o:defs.hcommand.hdisplay.o:defs.hbuffer.hinsert.o:defs.hbuffer.hsearch.o:defs.hbuffer.hfiles.o:defs.hbuffer.hcommand.hutils.o:defs.h.PHONY:cleanclean:rmedit$(objects)12/12/202271EmbeddedOperatingSystems簡化后的makefile文件

objects=main.內(nèi)部變量$@擴展成當前規(guī)則的目的文件名$<擴展成依賴列表中的第一個依賴文件$^擴展成整個依賴列表(除掉了里面所有重復的文件名)等等不需要括號括住例如:

CC=gcc

CFLAGS=-Wall-O-g

foo.o:foo.cfoo.hbar.h

$(CC)$(CFLAGS)-c$<-o$@12/12/202272EmbeddedOperatingSystems內(nèi)部變量$@擴展成當前規(guī)則的目的文件名12/11/20227隱含規(guī)則(ImplicitRules)內(nèi)置的規(guī)則告訴make當沒有給出某些命令的時候,應該怎么辦。用戶可以使用預定義的變量改變隱含規(guī)則的工作方式,如一個C編譯的具體命令將會是:$(CC)$(CFLAGS)$(CPPFLAGS)$(TARGET_ARCH)-c$<-o$@12/12/202273EmbeddedOperatingSystems隱含規(guī)則(ImplicitRules)內(nèi)置的規(guī)則12/1設定目標(PhonyTargets)設定目標目標不是一個文件其目的是為了讓一些命令得以執(zhí)行使用PHONY顯式聲明設定目標.PHONY:clean使用設定目標實現(xiàn)多個目的all:prog1prog212/12/202274EmbeddedOperatingSystems設定目標(PhonyTargets)設定目標12/11/2典型的設定目標設定目的也可以用來描述一些其他的動作。例如,想把中間文件和可執(zhí)行文件刪除,可以在makefile里設立這樣一個規(guī)則:

clean: $rm*.oexec_file前提是沒有其它的規(guī)則依靠這個'clean'目的,它將永遠不會被執(zhí)行。但是,如果你明確的使用命令'makeclean',make會把這個目的做為它的主要目標,執(zhí)行那些rm命令12/12/202275EmbeddedOperatingSystems典型的設定目標設定目的也可以用來描述一些其他的動作。例如,想Makefile中的函數(shù)(Functions)用來計算出要操作的文件、目標或者要執(zhí)行的命令使用方法:$(functionarguments)典型的函數(shù)$(substfrom,to,text)$(substee,EE,feetonthestreet)相當于`fEEtonthestrEEt'12/12/202276EmbeddedOperatingSystemsMakefile中的函數(shù)(Functions)用來計算出要$(patsubst

pattern,replacement,text)$(patsubst%.c,%.o,x.c.cbar.c)相當于`x.c.obar.o‘$(wildcard

pattern)$(wildcard*.c)objects:=$(wildcard*.o)12/12/202277EmbeddedOperatingSystems$(patsubstpattern,replacementmakefile中的條件語句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendif12/12/202278EmbeddedOperatingSystemsmakefile中的條件語句conditional-dire四種條件語句ifeq...else...endififneq…else…endififndef…else…endififndef...else…endif12/12/202279EmbeddedOperatingSystems四種條件語句ifeq...else...endif12/11實際項目中的makefile找到Linux或者uClinux源代碼中所有的makefile,分析它們的功能、相互關(guān)系。12/12/202280EmbeddedOperatingSystems實際項目中的makefile找到Linux或者uClinux3、GNUTools—ldld,TheGNULinker

Linux上常用的鏈接器ld軟件的作用是把各種目標文件(.o文件)和庫文件鏈接在一起,并定位數(shù)據(jù)和函數(shù)地址,最終生成可執(zhí)行程序gcc可以間接的調(diào)用ld,使用gcc的-Wl參數(shù)可以傳遞參數(shù)給ld使用命令:ld--help可以列出ld常用的一些選項12/12/202281EmbeddedOperatingSystems3、GNUTools—ldld,TheGNULinkeld使用舉例(1)源程序編譯hello.c到hello.o命令:gcc-chello.c12/12/202282EmbeddedOperatingSystemsld使用舉例(1)源程序12/11/202282Embeddld使用舉例(2)鏈接命令:ld–dynamic-linker/lib/ld-linux.so.2/usr/lib/crt1.o/usr/lib/crti.o/usr/lib/crtn.ohello.o–lc–ohello運行./hello12/12/202283EmbeddedOperatingSystemsld使用舉例(2)鏈接12/11/202283Embedde目標文件ld通過BFD庫可以讀取和操作coff、elf、a.out等各種執(zhí)行文件格式的目標文件BFD(BinaryFileDescriptor)目標文件(objectfile)由多個節(jié)(section)組成,常見的節(jié)有:text節(jié)保存了可執(zhí)行代碼,data節(jié)保存了有初值的全局標量,bss節(jié)保存了無初值的全局變量。12/12/202284EmbeddedOperatingSystems目標文件ld通過BFD庫可以讀取和操作coff、elf、a.使用objdump查看目標文件的信息objdump–hhello.o比較hello

12/12/202285EmbeddedOperatingSystems使用objdump查看目標文件的信息12/11/202285鏈接描述文件(Linkerscript)可以使用鏈接描述文件控制ld的鏈接過程。鏈接描述文件,commandfile

又稱為鏈接腳本,Linkerscript用來控制ld的鏈接過程描述各輸入文件的各節(jié)如何映射到輸出文件的各節(jié)控制輸出文件中各個節(jié)或者符號的內(nèi)存布局使用的語言為:Theldcommandlanguage,鏈接命令語言12/12/202286EmbeddedOperatingSystems鏈接描述文件(Linkerscript)可以使用鏈接描ld命令的-Tcommandfile選項指定了鏈接描述文件名如果不指定鏈接描述文件,ld就會使用一個默認的描述文件來產(chǎn)生執(zhí)行文件找到Linux或者uClinux中的鏈接描述文件并分析。12/12/202287EmbeddedOperatingSystemsld命令的-Tcommandfile選項指定了鏈接描述文件鏈接描述文件的命令鏈接描述文件的命令主要包括如下幾類:設置入口點命令處理文件的命令處理文件格式的命令其他12/12/202288EmbeddedOperatingSystems鏈接描述文件的命令鏈接描述文件的命令主要包括如下幾類:12/常用的命令設置入口點格式:ENTRY(symbol)

設置symbol的值為執(zhí)行程序的入口點。ld有多種方法設置執(zhí)行程序的入口點,確定程序入口點的順序如下:ld命令的-e選項指定的值Entry(symbol)指定的值.text節(jié)的起始地址入口點為012/12/202289EmbeddedOperatingSystems常用的命令設置入口點12/11/202289Embedded常用的命令I(lǐng)NCULDEfilename

包含其他filename的鏈接描述文件INPUT(file,file,…)

指定多個輸入文件名12/12/202290EmbeddedOperatingSystems常用的命令I(lǐng)NCULDEfilename

包含其他file常用的命令OUTPUT_FORMAT(bfdname)

指定輸出文件的格式OUTPUT_ARCH(bfdname)指定目標機器體系結(jié)構(gòu),例如:

OUTPUT_ARCH(arm)12/12/202291EmbeddedOperatingSystems常用的命令OUTPUT_FORMAT(bfdname)

指定常用的命令MEMORY:

這個命令在用于嵌入式系統(tǒng)的鏈接描述文件中經(jīng)常出現(xiàn),它描述了各個內(nèi)存塊的起始地址和大小。格式如下:MEMORY{ name[(attr)]:ORIGIN=origin,LENGTH=len …}例如:12/12/202292EmbeddedOperatingSystems常用的命令MEMORY:

這個命令在用于嵌入式系統(tǒng)的鏈接描述Memory舉例12/12/202293EmbeddedOperatingSystemsMemory舉例12/11/202293EmbeddedOSECTIONS命令SECTIONS

告訴ld如何把輸入文件的各個節(jié)映射到輸出文件的各個節(jié)中。在一個鏈接描述文件中只能有一個SECTIONS命令在SECTIONS命令中可以使用的命令有三種:定義入口點賦值定義輸出節(jié)12/12/202294EmbeddedOperatingSystemsSECTIONS命令SECTIONS

告訴ld如何把輸入文件定義輸出節(jié)SECTIONS

{

...

secname:

{

contents

}

...

}例如:12/12/202295EmbeddedOperatingSystems定義輸出節(jié)SECTIONS

{

...

secname定位計數(shù)器定位計數(shù)器,TheLocationCounter一個特殊的ld變量,使用“.”表示總是在SECTIONS中使用例如:12/12/202296EmbeddedOperatingSystems定位計數(shù)器定位計數(shù)器,TheLocationCounte一個簡單例子下面是一個簡單的例子:

例中,輸出文件包含text,data,bss三個節(jié),而輸入文件也只包含這3個節(jié):SECTIONS{ .=0x01000000; .text:{*(.text)}; .=0x08000000; .data:{*(.data)}; .bss:{*(.bss)};}12/12/202297EmbeddedOperatingSystems一個簡單例子下面是一個簡單的例子:

例中,輸出文件包含texSECTIONS舉例(對應于上面的MEMORY例子)12/12/202298EmbeddedOperatingSystemsSECTIONS舉例(對應于上面的MEMORY例子)12/1Snapgear3.4.0,arm版linux鏈接描述文件Vmlinux:arch/$(ARCH)/kernel/vmlinux.lds制作壓縮版映像時

linux/arch/arm/boot/compressed/vmlinux.lds制作bootp時

linux/arch/arm/boot/bootp/bootp.lds12/12/202299EmbeddedOperatingSystemsSnapgear3.4.0,arm版linux鏈接描述文件1GNUtools交叉開發(fā)環(huán)境的安裝交叉開發(fā)環(huán)境源代碼配置安裝,or直接安裝二進制工具第一種方法比較復雜,如果有現(xiàn)成的二進制交叉環(huán)境,建議直接使用12/12/2022100EmbeddedOperatingSystemsGNUtools交叉開發(fā)環(huán)境的安裝交叉開發(fā)環(huán)境12/11使用源代碼安裝交叉開發(fā)環(huán)境GNUtools的各個軟件包相對獨立,在選擇時要注意各個軟件包的版本號及其依賴關(guān)系如果全部是最新版本,也并不能保證可以配置并安裝成功在安裝GNUtools交叉開發(fā)環(huán)境之前,首先必須建立本地GNUtools環(huán)境12/12/2022101EmbeddedOperatingSystems使用源代碼安裝交叉開發(fā)環(huán)境GNUtools的各個軟件包相對一個可行的GNUtools與

Linux內(nèi)核之間關(guān)系表12/12/2022102EmbeddedOperatingSystems一個可行的GNUtools與

Linux內(nèi)核之間關(guān)系表12交叉開發(fā)環(huán)境的安裝順序需要5個步驟完成整個GNUTools的配置/編譯/安裝:內(nèi)核頭文件配置binutils軟件包安裝BootstrapGNU編譯器(可完成基本C語言編譯工作的編譯器)Clibrary的安裝,一般是glibc完整的GNU編譯器安裝12/12/2022103EmbeddedOperatingSystems交叉開發(fā)環(huán)境的安裝順序需要5個步驟完成整個GNUTools軟件包安裝步驟對每個單獨的軟件包,一般安裝過程包括下面4步下載并解壓軟件包配置軟件包編譯軟件包安裝軟件包12/12/2022104EmbeddedOperatingSystems軟件包安裝步驟對每個單獨的軟件包,一般安裝過程包括下面4步1安裝現(xiàn)成的二進制交叉環(huán)境下載arm-elf-tools的最新版本或合適的版本

如:arm-elf-tools-20030314.sh地址:/pub/uClinux/arm-elf-tools/arm-elf-tools-20030314.sh

或者:/pub/snapgear/tools/arm-elf/arm-elf-tools-20030314.sh…安裝在root權(quán)限下運行sh./arm-elf-tools-20030314.sh

這個命令會在開發(fā)主機上自動建立一個uClinux-ARM的交叉編譯環(huán)境12/12/2022105EmbeddedOperatingSystems安裝現(xiàn)成的二進制交叉環(huán)境下載arm-elf-tools的最新安裝成功?檢查一下(演示)對arm-elf運用shell的tab功能可以看到一系列arm-elf打頭的程序,如binutils系列、gcc、gdb等等運行arm-elf-gcc–v12/12/2022106EmbeddedOperatingSystems安裝成功?檢查一下(演示)12/11/2022106Embe12/12/2022107EmbeddedOperatingSystems12/11/2022107EmbeddedOperatin作業(yè)二根據(jù)教案中的示例,熟悉GNU工具鏈,回答教案中的問題。12/12/2022108EmbeddedOperatingSystems作業(yè)二根據(jù)教案中的示例,熟悉GNU工具鏈,回答教案中的問題。Thanks!Theend.Thanks!Theend.嵌入式操作系統(tǒng)陳香蘭xlanchen@助教:陳博、李春華嵌入式操作系統(tǒng)陳香蘭GNU開發(fā)工具鏈介紹

“工欲善其事,必先利其器”--《論語》GNU開發(fā)工具鏈介紹 主要內(nèi)容GNUTools簡介GNUTools交叉開發(fā)環(huán)境及其安裝12/12/2022112EmbeddedOperatingSystems主要內(nèi)容GNUTools簡介12/11/20223Embe本地開發(fā)vs交叉平臺開發(fā)本地開發(fā):

一般軟件的開發(fā)屬于本地開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)是相同的。交叉平臺開發(fā):

本課程所涉及到的嵌入式系統(tǒng)開發(fā)屬于交叉平臺開發(fā),也就是說開發(fā)軟件的系統(tǒng)與運行軟件的系統(tǒng)不同。12/12/2022113EmbeddedOperatingSystems本地開發(fā)vs交叉平臺開發(fā)本地開發(fā):

一般軟件的開發(fā)屬于本交叉開發(fā)平臺主機:

開發(fā)軟件的平臺,稱為主機,往往是通用電腦;目標機:

運行軟件的平臺,稱為目標機,在這里是嵌入式系統(tǒng)。12/12/2022114EmbeddedOperatingSystems交叉開發(fā)平臺主機:

開發(fā)軟件的平臺,稱為主機,往往是通用電腦嵌入式交叉開發(fā)工具掌握嵌入式開發(fā)工具的使用是進行嵌入式開發(fā)的前提條件之一與主流開發(fā)工具類似,嵌入式交叉開發(fā)工具也包括編譯器,即能夠把一個源程序編譯生成一個可執(zhí)行程序的軟件調(diào)試工具,即能夠?qū)?zhí)行程序進行源碼或匯編級調(diào)試的軟件軟件工程工具,用于協(xié)助多人開發(fā)或大型軟件項目的管理的軟件12/12/2022115EmbeddedOperatingSystems嵌入式交叉開發(fā)工具掌握嵌入式開發(fā)工具的使用是進行嵌入式開發(fā)的GNUtoolsGNUtools和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件GCCBinutils—輔助GCC的主要軟件Gdbmakecvs12/12/2022116EmbeddedOperatingSystemsGNUtoolsGNUtools和其他一些優(yōu)秀的開源軟件一、GCC很多人認為GCC只是一個C編譯器,

其實GCC=GNUCompilerCollection目前,GCC可以支持多種高級語言,如C、C++ADAObjectCJAVAFortranPASCAL12/12/2022117EmbeddedOperatingSystems一、GCC很多人認為GCC只是一個C編譯器,

其實GCC=GCC下的工具cpp—預處理器

GNUC編譯器在編譯前自動使用cpp對用戶程序進行預處理gcc—符合ISO等標準的C編譯器g++—基本符合ISO標準的C++編譯器gcj—GCC的java前端gnat—GCC的GNUADA95前端12/12/2022118EmbeddedOperatingSystemsGCC下的工具cpp—預處理器

GNUC編譯器在編譯前GNUTools—gccgcc是一個強大的工具集合,它包含了預處理器、編譯器、匯編器、鏈接器等組件。它會在需要的時候調(diào)用其他組件。

輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。對于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對嵌入式系統(tǒng)級的軟件開發(fā)非常重要12/12/2022119EmbeddedOperatingSystemsGNUTools—gccgcc是一個強大的工具集合,它包含gcc使用舉例(1)

源程序12/12/2022120EmbeddedOperatingSystemsgcc使用舉例(1)

源程序12/11/202211Embegcc使用舉例(2)

編譯和運行編譯運行12/12/2022121EmbeddedOperatingSystemsgcc使用舉例(2)

編譯和運行編譯運行12/11/2022gcc的工作過程(1)如果使用-v選項,則可以看到許多被隱藏的信息12/12/2022122EmbeddedOperatingSystemsgcc的工作過程(1)如果使用-v選項,則可以看到許多被隱藏12/12/2022123EmbeddedOperatingSystems12/11/202214EmbeddedOperatinggcc的編譯過程一般情況下,c程序的編譯過程為1、預處理2、編譯成匯編代碼3、匯編成目標代碼4、鏈接12/12/2022124EmbeddedOperatingSystemsgcc的編譯過程一般情況下,c程序的編譯過程為12/11/21、預處理預處理:使用-E參數(shù)

輸出文件的后綴為“.cpp” gcc–E–ogcctest.cppgcctest.c使用wc命令比較預處理后的文件與源文件,可以看到兩個文件的差異12/12/2022125EmbeddedOperatingSystems1、預處理預處理:使用-E參數(shù)

輸出文件的后綴為“.cpp”行數(shù)單詞數(shù)字節(jié)數(shù)預編譯12/12/2022126EmbeddedOperatingSystems行數(shù)單詞數(shù)字節(jié)數(shù)預編譯12/11/202217Embed預處理文件匯編代碼

1)使用-x參數(shù)說明根據(jù)指定的步驟進行工作,cpp-output指明從預處理得到的文件開始編譯

2)使用-S說明生成匯編代碼后停止工作gcc–xcpp-output–S–ogcctest.sgcctest.cpp也可以直接編譯到匯編代碼 gcc–Sgcctest.c2、編譯成匯編代碼12/12/2022127EmbeddedOperatingSystems預處理文件匯編代碼

1)使用-x參數(shù)說明根據(jù)指定的步驟進行預處理文件匯編代碼直接編譯到匯編代碼s12/12/2022128EmbeddedOperatingSystems預處理文件匯編代碼直接編譯到匯編代碼s12/11/20223、編譯成目標代碼匯編代碼目標代碼 gcc–xassembler–cgcctest.s直接編譯成目標代碼 gcc–cgcctest.c使用匯編器生成目標代碼as–ogcctest.ogcctest.s12/12/2022129EmbeddedOperatingSystems3、編譯成目標代碼匯編代碼目標代碼12/11/202220匯編代碼目標代碼直接編譯成目標代碼使用匯編器12/12/2022130EmbeddedOperatingSystems匯編代碼目標代碼直接編譯成目標代碼使用匯編器12/11/24、編譯成執(zhí)行代碼目標代碼執(zhí)行代碼 gcc–ogcctestgcctest.o直接生成執(zhí)行代碼 gcc–ogcctestgcctest.c12/12/2022131EmbeddedOperatingSystems4、編譯成執(zhí)行代碼目標代碼執(zhí)行代碼12/11/202222目標代碼執(zhí)行代碼直接生成執(zhí)行代碼12/12/2022132EmbeddedOperatingSystems目標代碼執(zhí)行代碼直接生成執(zhí)行代碼12/11/202223Egcc的高級選項-Wall:打開所有的警告信息12/12/2022133EmbeddedOperatingSystemsgcc的高級選項-Wall:打開所有的警告信息12/11/2根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應當返回一個值12/12/2022134EmbeddedOperatingSystems根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末修改源程序12/12/2022135EmbeddedOperatingSystems修改源程序12/11/202226EmbeddedOper優(yōu)化編譯優(yōu)化編譯選項有:-O0

缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化12/12/2022136EmbeddedOperatingSystems優(yōu)化編譯優(yōu)化編譯選項有:不同程度的優(yōu)化12/11/20222gcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化編譯選項12/12/2022137EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化12/gcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計程序的運行12/12/2022138EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計程序的運行1二、GNUbinutilsbinutils是一組二進制工具程序集,是輔助GCC的主要軟件,它主要包括addr2line把程序地址轉(zhuǎn)換為文件名和行號。在命令行中給它一個地址和一個可執(zhí)行文件名,它就會使用這個可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個文件以及行號。ar建立、修改、提取歸檔文件。歸檔文件是包含多個文件內(nèi)容的一個大文件,其結(jié)構(gòu)保證了可以恢復原始文件內(nèi)容。12/12/2022139EmbeddedOperatingSystems二、GNUbinutilsbinutils是一組二進制工具as是GNU匯編器,主要用來編譯GNUC編譯器gcc輸出的匯編文件,他將匯編代碼轉(zhuǎn)換成二進制代碼,并存放到一個object文件中,該目標文件將由連接器ld連接C++filt解碼C++符號名,連接器使用它來過濾C++和Java符號,防止重載函數(shù)沖突。gprof顯示程序調(diào)用段的各種數(shù)據(jù)。ld是連接器,它把一些目標和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并鏈接符號引用,最終形成一個可執(zhí)行文件。通常,建立一個新編譯程序的最后一步就是調(diào)用ld。12/12/2022140EmbeddedOperatingSystemsas是GNU匯編器,主要用來編譯GNUC編譯器gcc輸出nm列出目標文件中的符號。objcopy把一種目標文件中的內(nèi)容復制到另一種類型的目標文件中.objdump顯示一個或者更多目標文件的信息。使用選項來控制其顯示的信息。它所顯示的信息通常只有編寫編譯工具的人才感興趣。ranlib產(chǎn)生歸檔文件索引,并將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。readelf顯示elf格式可執(zhí)行文件的信息。12/12/2022141EmbeddedOperatingSystemsnm列出目標文件中的符號。12/11/202232Embesize列出目標文件每一段的大小以及總體的大小。默認情況下,對于每個目標文件或者一個歸檔文件中的每個模塊只產(chǎn)生一行輸出。strings打印某個文件的可打印字符串,這些字符串最少4個字符長,也可以使用選項-n設置字符串的最小長度。默認情況下,它只打印目標文件初始化和可加載段中的可打印字符;對于其它類型的文件它打印整個文件的可打印字符,這個程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。strip丟棄目標文件中的全部或者特定符號。12/12/2022142EmbeddedOperatingSystemssize列出目標文件每一段的大小以及總體的大小。默認情況下libiberty包含許多GNU程序都會用到的函數(shù),這些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd二進制文件描述庫.libopcodes用來處理opcodes的庫,在生成一些應用程序的時候也會用到它,比如objdump.Opcodes是文本格式可讀的處理器操作指令.12/12/2022143EmbeddedOperatingSystemslibiberty包含許多GNU程序都會用到的函數(shù),這些binutils開發(fā)工具使用舉例arnmObjcopyObjdumpreadelf12/12/2022144EmbeddedOperatingSystemsbinutils開發(fā)工具使用舉例ar12/11/2022351、arar用于建立、修改、提取歸檔文件(archive),一個歸檔文件,是包含多個被包含文件的單個文件(也可以認為歸檔文件是一個庫文件)。被包含的原始文件的內(nèi)容、權(quán)限、時間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原12/12/2022145EmbeddedOperatingSystems1、arar用于建立、修改、提取歸檔文件(archive),使用ar建立庫文件(1)源程序add.c和minus.c12/12/2022146EmbeddedOperatingSystems使用ar建立庫文件(1)源程序add.c和minus.c12使用ar建立庫文件(2)編譯成目標文件將庫文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說明: r:將多個文件組成一個文件 v:輸出信息建立庫文件12/12/2022147EmbeddedOperatingSystems使用ar建立庫文件(2)編譯成目標文件將庫文件拷貝到/usr庫文件使用舉例

在代碼中使用Add和Minus函數(shù)12/12/2022148EmbeddedOperatingSystems庫文件使用舉例

在代碼中使用Add和Minus函數(shù)12/11在編譯時指定庫文件指明將libtest.a鏈接進來運行結(jié)果12/12/2022149EmbeddedOperatingSystems在編譯時指定庫文件指明將libtest.a鏈接進來運行結(jié)果12、nmnm的主要功能是列出目標文件中的符號,這樣程序員就可以定位和分析執(zhí)行程序和目標文件中的符號信息和它的屬性12/12/2022150EmbeddedOperatingSystems2、nmnm的主要功能是列出目標文件中的符號,這樣程序員就可nm顯示的符號類型A:符號的值是絕對值,并且不會被將來的鏈接所改變B:符號位于未初始化數(shù)據(jù)部分(BSS段)C:符號是公共的。公共符號是未初始化的數(shù)據(jù)。在鏈接時,多個公共符號可能以相同的名字出現(xiàn)。如果符號在其他地方被定義,則該文件中的這個符號會被當作引用來處理D:符號位于已初始化的數(shù)據(jù)部分T:符號位于代碼部分U:符號未被定義?:符號類型未知,或者目標文件格式特殊 12/12/2022151EmbeddedOperatingSystemsnm顯示的符號類型A:符號的值是絕對值,并且不會被將來的鏈接nm使用舉例如果對test可執(zhí)行文件使用nm,會有什么結(jié)果呢?(作業(yè))12/12/2022152EmbeddedOperatingSystemsnm使用舉例如果對test可執(zhí)行文件使用nm,12/11/23、objcopy可以將一種格式的目標文件內(nèi)容進行轉(zhuǎn)換,并輸出為另一種格式的目標文件。它使用GNUBFD(binaryformatdescription)庫讀/寫目標文件,通過這個BFD庫,objcopy能以一種不同于源目標文件的格式生成新的目標文件$objcopy-h在makefile里面用-Obinary選項來生成原始的二進制文件,即通常說的image文件12/12/2022153EmbeddedOperatingSystems3、objcopy可以將一種格式的目標文件內(nèi)容進行轉(zhuǎn)換,并輸Objcopy使用舉例使用file命令查看文件類型生成srec格式的目標文件使用file命令查看新文件的類型12/12/2022154EmbeddedOperatingSystemsObjcopy使用舉例使用file命令查看文件類型生成sre文件格式a.out:

assemblerandlinkeditoroutput

匯編器和鏈接編輯器的輸出coff

commonobjectfileformat

一種通用的對象文件格式ELF

excutivelinkedfile

Linux系統(tǒng)所采用的一種通用文件格式,支持動態(tài)連接。ELF格式可以比COFF格式包含更多的調(diào)試信息12/12/2022155EmbeddedOperatingSystems文件格式a.out:

assemblerandlink文件格式Flat

elf格式有很大的文件頭,flat文件對文件頭和一些段信息做了簡化

uClinux系統(tǒng)使用flat可執(zhí)行文件格式SREC

MOTOROLAS-Recoder格式(S記錄格式文件)等等12/12/2022156EmbeddedOperatingSystems文件格式Flat

elf格式有很大的文件頭,flat文件對文4、objdump顯示一個或多個目標文件的信息,由其選項來控制顯示哪些信息。一般來說,objdump只對那些要編寫編譯工具的程序員有幫助,但是我們通過這個工具可以方便的查看執(zhí)行文件或者庫文件的信息12/12/2022157EmbeddedOperatingSystems4、objdump顯示一個或多個目標文件的信息,由其選項來控Objdump使用舉例(1)-f選項:顯示文件頭中的內(nèi)容12/12/2022158EmbeddedOperatingSystemsObjdump使用舉例(1)-f選項:顯示文件頭中的內(nèi)容12Objdump使用舉例(2)-d選項進行反匯編12/12/2022159EmbeddedOperatingSystemsObjdump使用舉例(2)-d選項進行反匯編12/11/25、readelfreadelf:

顯示一個或多個ELF格式的目標文件信息。12/12/2022160EmbeddedOperatingSystems5、readelfreadelf:

顯示一個或多個ELF格式Readelf使用舉例12/12/2022161EmbeddedOperatingSystemsReadelf使用舉例12/11/202252Embedde三、其他GNU工具Gdb—調(diào)試器GNUmake--軟件工程工具diff,patch--補丁工具CVS--版本控制系統(tǒng)12/12/2022162EmbeddedOperatingSystems三、其他GNU工具Gdb—調(diào)試器12/11/202253Em1、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的調(diào)試器,功能強大設置斷點監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠程調(diào)試12/12/2022163EmbeddedOperatingSystems1、GNUToolchain—gdbGdb=GNUgdb使用舉例源代碼如下編譯:gcc–obugbug.c12/12/2022164EmbeddedOperatingSystemsgdb使用舉例源代碼如下編譯:12/11/202255Emb編譯并運行????編譯12/12/2022165EmbeddedOperatingSystems編譯并運行????編譯12/11/202256Embedde使用gdb調(diào)試bug

運行bug輸入字

溫馨提示

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

評論

0/150

提交評論