版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
xlanchen@2007.5.22EmbeddedOperatingSystems1
“工欲善其事, 必先利其器”
--《論語(yǔ)》xlanchen@2007.5.22EmbeddedOperatingSystems2主要內(nèi)容GNUTools簡(jiǎn)介GNUTools交叉開發(fā)環(huán)境及其安裝xlanchen@2007.5.22EmbeddedOperatingSystems3本地開發(fā)vs交叉平臺(tái)開發(fā)本地開發(fā):
一般軟件的開發(fā)屬于本地開發(fā),也就是說(shuō)開發(fā)軟件的系統(tǒng)與運(yùn)行軟件的系統(tǒng)是相同的。交叉平臺(tái)開發(fā):
本課程所涉及到的嵌入式系統(tǒng)開發(fā)屬于交叉平臺(tái)開發(fā),也就是說(shuō)開發(fā)軟件的系統(tǒng)與運(yùn)行軟件的系統(tǒng)不同。xlanchen@2007.5.22EmbeddedOperatingSystems4交叉開發(fā)平臺(tái)主機(jī):
開發(fā)軟件的平臺(tái),稱為主機(jī),往往是通用電腦;目標(biāo)機(jī):
運(yùn)行軟件的平臺(tái),稱為目標(biāo)機(jī),在這里是嵌入式系統(tǒng)。xlanchen@2007.5.22EmbeddedOperatingSystems5嵌入式交叉開發(fā)工具掌握嵌入式開發(fā)工具的使用是進(jìn)行嵌入式開發(fā)的前提條件之一與主流開發(fā)工具類似,嵌入式交叉開發(fā)工具也包括編譯器,即能夠把一個(gè)源程序編譯生成一個(gè)可執(zhí)行程序的軟件調(diào)試工具,即能夠?qū)?zhí)行程序進(jìn)行源碼或匯編級(jí)調(diào)試的軟件軟件工程工具,用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理的軟件xlanchen@2007.5.22EmbeddedOperatingSystems6GNUtoolsGNUtools和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件GCCBinutils—輔助GCC的主要軟件Gdbmakecvsxlanchen@2007.5.22EmbeddedOperatingSystems7一、GCC很多人認(rèn)為GCC只是一個(gè)C編譯器,
其實(shí)GCC=GNUCompilerCollection目前,GCC可以支持多種高級(jí)語(yǔ)言,如C、C++ADAObjectCJAVAFortranPASCALxlanchen@2007.5.22EmbeddedOperatingSystems8GCC下的工具cpp—預(yù)處理器
GNUC編譯器在編譯前自動(dòng)使用cpp對(duì)用戶程序進(jìn)行預(yù)處理gcc—符合ISO等標(biāo)準(zhǔn)的C編譯器g++—基本符合ISO標(biāo)準(zhǔn)的C++編譯器gcj—GCC的java前端gnat—GCC的GNUADA95前端xlanchen@2007.5.22EmbeddedOperatingSystems9GNUTools—gccgcc是一個(gè)強(qiáng)大的工具集合,它包含了預(yù)處理器、編譯器、匯編器、鏈接器等組件。它會(huì)在需要的時(shí)候調(diào)用其他組件。
輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。對(duì)于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對(duì)嵌入式系統(tǒng)級(jí)的軟件開發(fā)非常重要xlanchen@2007.5.22EmbeddedOperatingSystems10gcc使用舉例(1)
源程序xlanchen@2007.5.22EmbeddedOperatingSystems11gcc使用舉例(2)
編譯和運(yùn)行編譯運(yùn)行xlanchen@2007.5.22EmbeddedOperatingSystems12gcc的工作過(guò)程(1)如果使用-v選項(xiàng),則可以看到許多被隱藏的信息xlanchen@2007.5.22EmbeddedOperatingSystems13xlanchen@2007.5.22EmbeddedOperatingSystems14gcc的編譯過(guò)程一般情況下,c程序的編譯過(guò)程為1、預(yù)處理2、編譯成匯編代碼3、匯編成目標(biāo)代碼4、鏈接xlanchen@2007.5.22EmbeddedOperatingSystems151、預(yù)處理預(yù)處理:使用-E參數(shù)
輸出文件的后綴為“.cpp” gcc–E–ogcctest.cppgcctest.c使用wc命令比較預(yù)處理后的文件與源文件,可以看到兩個(gè)文件的差異xlanchen@2007.5.22EmbeddedOperatingSystems16行數(shù)單詞數(shù)字節(jié)數(shù)預(yù)編譯xlanchen@2007.5.22EmbeddedOperatingSystems17預(yù)處理文件匯編代碼
1)使用-x參數(shù)說(shuō)明根據(jù)指定的步驟進(jìn)行工作,cpp-output指明從預(yù)處理得到的文件開始編譯
2)使用-S說(shuō)明生成匯編代碼后停止工作gcc–xcpp-output–S–ogcctest.sgcctest.cpp也可以直接編譯到匯編代碼
gcc–Sgcctest.c2、編譯成匯編代碼xlanchen@2007.5.22EmbeddedOperatingSystems18預(yù)處理文件匯編代碼直接編譯到匯編代碼xlanchen@2007.5.22EmbeddedOperatingSystems193、編譯成目標(biāo)代碼匯編代碼目標(biāo)代碼
gcc–xassembler–cgcctest.s直接編譯成目標(biāo)代碼
gcc–cgcctest.c使用匯編器生成目標(biāo)代碼as–ogcctest.ogcctest.sxlanchen@2007.5.22EmbeddedOperatingSystems20匯編代碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器xlanchen@2007.5.22EmbeddedOperatingSystems214、編譯成執(zhí)行代碼目標(biāo)代碼執(zhí)行代碼
gcc–ogcctestgcctest.o直接生成執(zhí)行代碼
gcc–ogcctestgcctest.cxlanchen@2007.5.22EmbeddedOperatingSystems22目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼xlanchen@2007.5.22EmbeddedOperatingSystems23gcc的高級(jí)選項(xiàng)-Wall:打開所有的警告信息xlanchen@2007.5.22EmbeddedOperatingSystems24根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應(yīng)當(dāng)返回一個(gè)值xlanchen@2007.5.22EmbeddedOperatingSystems25修改源程序xlanchen@2007.5.22EmbeddedOperatingSystems26優(yōu)化編譯優(yōu)化編譯選項(xiàng)有:-O0
缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化xlanchen@2007.5.22EmbeddedOperatingSystems27gcc的優(yōu)化編譯舉例(1)
考慮如下的源代碼不同的優(yōu)化編譯選項(xiàng)xlanchen@2007.5.22EmbeddedOperatingSystems28gcc的優(yōu)化編譯舉例(2)
使用time命令統(tǒng)計(jì)程序的運(yùn)行xlanchen@2007.5.22EmbeddedOperatingSystems29二、GNUbinutilsbinutils是一組二進(jìn)制工具程序集,是輔助GCC的主要軟件,它主要包括addr2line
把程序地址轉(zhuǎn)換為文件名和行號(hào)。在命令行中給它一個(gè)地址和一個(gè)可執(zhí)行文件名,它就會(huì)使用這個(gè)可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個(gè)文件以及行號(hào)。ar
建立、修改、提取歸檔文件。歸檔文件是包含多個(gè)文件內(nèi)容的一個(gè)大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始文件內(nèi)容。xlanchen@2007.5.22EmbeddedOperatingSystems30as
是GNU匯編器,主要用來(lái)編譯GNUC編譯器gcc輸出的匯編文件,他將匯編代碼轉(zhuǎn)換成二進(jìn)制代碼,并存放到一個(gè)object文件中,該目標(biāo)文件將由連接器ld連接C++filt解碼C++符號(hào)名,連接器使用它來(lái)過(guò)濾C++和Java符號(hào),防止重載函數(shù)沖突。gprof
顯示程序調(diào)用段的各種數(shù)據(jù)。ld
是連接器,它把一些目標(biāo)和歸檔文件結(jié)合在一起,重定位數(shù)據(jù),并鏈接符號(hào)引用,最終形成一個(gè)可執(zhí)行文件。通常,建立一個(gè)新編譯程序的最后一步就是調(diào)用ld。xlanchen@2007.5.22EmbeddedOperatingSystems31nm
列出目標(biāo)文件中的符號(hào)。objcopy把一種目標(biāo)文件中的內(nèi)容復(fù)制到另一種類型的目標(biāo)文件中.objdump
顯示一個(gè)或者更多目標(biāo)文件的信息。使用選項(xiàng)來(lái)控制其顯示的信息。它所顯示的信息通常只有編寫編譯工具的人才感興趣。ranlib
產(chǎn)生歸檔文件索引,并將其保存到這個(gè)歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標(biāo)文件。readelf
顯示ebf格式可執(zhí)行文件的信息。xlanchen@2007.5.22EmbeddedOperatingSystems32size
列出目標(biāo)文件每一段的大小以及總體的大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。strings
打印某個(gè)文件的可打印字符串,這些字符串最少4個(gè)字符長(zhǎng),也可以使用選項(xiàng)-n設(shè)置字符串的最小長(zhǎng)度。默認(rèn)情況下,它只打印目標(biāo)文件初始化和可加載段中的可打印字符;對(duì)于其它類型的文件它打印整個(gè)文件的可打印字符,這個(gè)程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。strip
丟棄目標(biāo)文件中的全部或者特定符號(hào)。xlanchen@2007.5.22EmbeddedOperatingSystems33libiberty
包含許多GNU程序都會(huì)用到的函數(shù),這些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd
二進(jìn)制文件描述庫(kù).libopcodes
用來(lái)處理opcodes的庫(kù),在生成一些應(yīng)用程序的時(shí)候也會(huì)用到它,比如objdump.Opcodes是文本格式可讀的處理器操作指令.xlanchen@2007.5.22EmbeddedOperatingSystems34binutils開發(fā)工具使用舉例arnmObjcopyObjdumpreadelfxlanchen@2007.5.22EmbeddedOperatingSystems351、arar用于建立、修改、提取歸檔文件(archive),一個(gè)歸檔文件,是包含多個(gè)被包含文件的單個(gè)文件(也可以認(rèn)為歸檔文件是一個(gè)庫(kù)文件)。被包含的原始文件的內(nèi)容、權(quán)限、時(shí)間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原xlanchen@2007.5.22EmbeddedOperatingSystems36使用ar建立庫(kù)文件(1)源程序add.c和minus.cxlanchen@2007.5.22EmbeddedOperatingSystems37使用ar建立庫(kù)文件(2)編譯成目標(biāo)文件將庫(kù)文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說(shuō)明:
r:將多個(gè)文件組成一個(gè)文件
v:輸出信息建立庫(kù)文件xlanchen@2007.5.22EmbeddedOperatingSystems38庫(kù)文件使用舉例
在代碼中使用Add和Minus函數(shù)xlanchen@2007.5.22EmbeddedOperatingSystems39在編譯時(shí)指定庫(kù)文件指明將libtest.a鏈接進(jìn)來(lái)運(yùn)行結(jié)果xlanchen@2007.5.22EmbeddedOperatingSystems402、nmnm的主要功能是列出目標(biāo)文件中的符號(hào),這樣程序員就可以定位和分析執(zhí)行程序和目標(biāo)文件中的符號(hào)信息和它的屬性xlanchen@2007.5.22EmbeddedOperatingSystems41nm顯示的符號(hào)類型A:符號(hào)的值是絕對(duì)值,并且不會(huì)被將來(lái)的鏈接所改變B:符號(hào)位于未初始化數(shù)據(jù)部分(BSS段)C:符號(hào)是公共的。公共符號(hào)是未初始化的數(shù)據(jù)。在鏈接時(shí),多個(gè)公共符號(hào)可能以相同的名字出現(xiàn)。如果符號(hào)在其他地方被定義,則該文件中的這個(gè)符號(hào)會(huì)被當(dāng)作引用來(lái)處理D:符號(hào)位于已初始化的數(shù)據(jù)部分T:符號(hào)位于代碼部分U:符號(hào)未被定義?:符號(hào)類型未知,或者目標(biāo)文件格式特殊 xlanchen@2007.5.22EmbeddedOperatingSystems42nm使用舉例如果對(duì)test可執(zhí)行文件使用nm,會(huì)有什么結(jié)果呢?(作業(yè))xlanchen@2007.5.22EmbeddedOperatingSystems433、objcopy可以將一種格式的目標(biāo)文件內(nèi)容進(jìn)行轉(zhuǎn)換,并輸出為另一種格式的目標(biāo)文件。它使用GNUBFD(binaryformatdescription)庫(kù)讀/寫目標(biāo)文件,通過(guò)這個(gè)BFD庫(kù),objcopy能以一種不同于源目標(biāo)文件的格式生成新的目標(biāo)文件$objcopy-h在makefile里面用-Obinary選項(xiàng)來(lái)生成原始的二進(jìn)制文件,即通常說(shuō)的image文件xlanchen@2007.5.22EmbeddedOperatingSystems44Objcopy使用舉例使用file命令查看文件類型生成srec格式的目標(biāo)文件使用file命令查看新文件的類型xlanchen@2007.5.22EmbeddedOperatingSystems45文件格式a.out:
assemblerandlinkeditoroutput
匯編器和鏈接編輯器的輸出coff
commonobjectfileformat
一種通用的對(duì)象文件格式ELF
excutivelinkedfile
Linux系統(tǒng)所采用的一種通用文件格式,支持動(dòng)態(tài)連接。ELF格式可以比COFF格式包含更多的調(diào)試信息xlanchen@2007.5.22EmbeddedOperatingSystems46文件格式Flat
elf格式有很大的文件頭,flat文件對(duì)文件頭和一些段信息做了簡(jiǎn)化
uClinux系統(tǒng)使用flat可執(zhí)行文件格式SREC
MOTOROLAS-Recoder格式(S記錄格式文件)等等xlanchen@2007.5.22EmbeddedOperatingSystems474、objdump顯示一個(gè)或多個(gè)目標(biāo)文件的信息,由其選項(xiàng)來(lái)控制顯示哪些信息。一般來(lái)說(shuō),objdump只對(duì)那些要編寫編譯工具的程序員有幫助,但是我們通過(guò)這個(gè)工具可以方便的查看執(zhí)行文件或者庫(kù)文件的信息xlanchen@2007.5.22EmbeddedOperatingSystems48Objdump使用舉例(1)-f選項(xiàng):顯示文件頭中的內(nèi)容xlanchen@2007.5.22EmbeddedOperatingSystems49Objdump使用舉例(2)-d選項(xiàng)進(jìn)行反匯編xlanchen@2007.5.22EmbeddedOperatingSystems505、readelfreadelf:
顯示一個(gè)或多個(gè)ELF格式的目標(biāo)文件信息。xlanchen@2007.5.22EmbeddedOperatingSystems51Readelf使用舉例xlanchen@2007.5.22EmbeddedOperatingSystems52三、其他GNU工具Gdb—調(diào)試器GNUmake--軟件工程工具diff,patch--補(bǔ)丁工具CVS--版本控制系統(tǒng)xlanchen@2007.5.22EmbeddedOperatingSystems531、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的調(diào)試器,功能強(qiáng)大設(shè)置斷點(diǎn)監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠(yuǎn)程調(diào)試xlanchen@2007.5.22EmbeddedOperatingSystems54gdb使用舉例源代碼如下編譯:gcc–obugbug.cxlanchen@2007.5.22EmbeddedOperatingSystems55編譯并運(yùn)行????編譯xlanchen@2007.5.22EmbeddedOperatingSystems56使用gdb調(diào)試bug
運(yùn)行bug輸入字符串hello顯示出錯(cuò)位置能不能看到源代碼呢?xlanchen@2007.5.22EmbeddedOperatingSystems57使用gcc的-g參數(shù)gcc–g–obugbug.c重新調(diào)試列出源代碼xlanchen@2007.5.22EmbeddedOperatingSystems58?怎么修改前面的源代碼呢?(作業(yè))設(shè)置斷點(diǎn)xlanchen@2007.5.22EmbeddedOperatingSystems592、使用GNUmake管理項(xiàng)目GNUmake是一種代碼維護(hù)工具,在使用GNU編譯器開發(fā)大型應(yīng)用時(shí),往往要使用make管理項(xiàng)目。如果不使用make管理項(xiàng)目,就必須重復(fù)使用多個(gè)復(fù)雜的命令行維護(hù)項(xiàng)目和生成目標(biāo)代碼。Make通過(guò)將命令行保存到makefile中簡(jiǎn)化了編譯工作。Make的主要任務(wù)是根據(jù)makefile中定義的規(guī)則和步驟,根據(jù)各個(gè)模塊的更新情況,自動(dòng)完成整個(gè)軟件項(xiàng)目的維護(hù)和代碼生成工作。xlanchen@2007.5.22EmbeddedOperatingSystems60Make可以識(shí)別出makefile中哪些文件已經(jīng)被修改,并且在再次編譯的時(shí)候只編譯這些文件,從而提高編譯的效率Make會(huì)檢查文件的修改和生成時(shí)間戳,如果目標(biāo)文件的修改或者生成時(shí)間戳比它的任意一個(gè)依賴文件舊,則make就執(zhí)行makefile文件中描述的相應(yīng)命令,以便更新目的文件只更新那些需要更新的文件,而不重新處理那些并不過(guò)時(shí)的文件xlanchen@2007.5.22EmbeddedOperatingSystems61特點(diǎn):適合于支持多文件構(gòu)成的大中型軟件項(xiàng)目的編譯,鏈接,清除中間文件等管理工作提供和識(shí)別多種默認(rèn)規(guī)則,方便對(duì)大型軟件項(xiàng)目的管理支持對(duì)多目錄的軟件項(xiàng)目進(jìn)行遞歸管理對(duì)軟件項(xiàng)目具有很好的可維護(hù)性和擴(kuò)展性xlanchen@2007.5.22EmbeddedOperatingSystems62makefileMakefile告訴make該做什么、怎么做makefile主要定義了1)依賴關(guān)系
即有關(guān)哪些文件的最新版本是依賴于哪些別的文件產(chǎn)生或者組成的2)需要用什么命令來(lái)產(chǎn)生目標(biāo)文件的最新版本3)以及一些其他的功能xlanchen@2007.5.22EmbeddedOperatingSystems63Makefile的規(guī)則規(guī)則
一條規(guī)則包含3個(gè)方面的內(nèi)容,1)要?jiǎng)?chuàng)建的目標(biāo)(文件),2)創(chuàng)建目標(biāo)(文件)所依賴的文件列表;3)通過(guò)依賴文件創(chuàng)建目標(biāo)文件的命令組xlanchen@2007.5.22EmbeddedOperatingSystems64規(guī)則一般形式target...:prerequisites...<tab>command
<tab>...<tab>...例如test:test.c;gcc–O–otesttest.cxlanchen@2007.5.22EmbeddedOperatingSystems65一個(gè)簡(jiǎn)單的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.oxlanchen@2007.5.22EmbeddedOperatingSystems66Make的工作過(guò)程defaultgoal
在缺省的情況下,make從makefile中的第一個(gè)目標(biāo)開始執(zhí)行Make的工作過(guò)程類似一次深度優(yōu)先遍歷過(guò)程xlanchen@2007.5.22EmbeddedOperatingSystems67Makefile中的變量使用變量可以降低錯(cuò)誤風(fēng)險(xiǎn)簡(jiǎn)化makefile例:objects變量($(objects))objects=main.okbd.ocommand.o\ display.oinsert.osearch.ofiles.outils.oedit:$(objects) cc-oedit$(objects)xlanchen@2007.5.22EmbeddedOperatingSystems68有點(diǎn)像環(huán)境變量環(huán)境變量在make過(guò)程中被解釋成make的變量可以被用來(lái)貯存一個(gè)文件名列表。貯存可執(zhí)行文件名。如用變量代替編譯器名。貯存編譯器FLAGxlanchen@2007.5.22EmbeddedOperatingSystems69預(yù)定義變量Make使用了許多預(yù)定義的變量,如ARASCCCXXCFLAGSCPPFLAGS等等xlanchen@2007.5.22EmbeddedOperatingSystems70簡(jiǎn)化后的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)xlanchen@2007.5.22EmbeddedOperatingSystems71內(nèi)部變量$@擴(kuò)展成當(dāng)前規(guī)則的目的文件名$<擴(kuò)展成依賴列表中的第一個(gè)依賴文件$^擴(kuò)展成整個(gè)依賴列表(除掉了里面所有重復(fù)的文件名)等等不需要括號(hào)括住例如:
CC=gcc
CFLAGS=-Wall-O-g
foo.o:foo.cfoo.hbar.h
$(CC)$(CFLAGS)-c$<-o$@xlanchen@2007.5.22EmbeddedOperatingSystems72隱含規(guī)則(ImplicitRules)內(nèi)置的規(guī)則告訴make當(dāng)沒(méi)有給出某些命令的時(shí)候,應(yīng)該怎么辦。用戶可以使用預(yù)定義的變量改變隱含規(guī)則的工作方式,如一個(gè)C編譯的具體命令將會(huì)是:$(CC)$(CFLAGS)$(CPPFLAGS)$(TARGET_ARCH)-c$<-o$@xlanchen@2007.5.22EmbeddedOperatingSystems73設(shè)定目標(biāo)(PhonyTargets)設(shè)定目標(biāo)目標(biāo)不是一個(gè)文件其目的是為了讓一些命令得以執(zhí)行使用PHONY顯式聲明設(shè)定目標(biāo).PHONY:clean使用設(shè)定目標(biāo)實(shí)現(xiàn)多個(gè)目的all:prog1prog2xlanchen@2007.5.22EmbeddedOperatingSystems74典型的設(shè)定目標(biāo)設(shè)定目的也可以用來(lái)描述一些其他的動(dòng)作。例如,想把中間文件和可執(zhí)行文件刪除,可以在makefile里設(shè)立這樣一個(gè)規(guī)則:
clean: $rm*.oexec_file前提是沒(méi)有其它的規(guī)則依靠這個(gè)'clean'目的,它將永遠(yuǎn)不會(huì)被執(zhí)行。但是,如果你明確的使用命令'makeclean',make會(huì)把這個(gè)目的做為它的主要目標(biāo),執(zhí)行那些rm命令xlanchen@2007.5.22EmbeddedOperatingSystems75Makefile中的函數(shù)(Functions)用來(lái)計(jì)算出要操作的文件、目標(biāo)或者要執(zhí)行的命令使用方法:$(functionarguments)典型的函數(shù)$(substfrom,to,text)$(substee,EE,feetonthestreet)相當(dāng)于`fEEtonthestrEEt'xlanchen@2007.5.22EmbeddedOperatingSystems76$(patsubst
pattern,replacement,text)$(patsubst%.c,%.o,x.c.cbar.c)相當(dāng)于`x.c.obar.o‘$(wildcard
pattern)$(wildcard*.c)objects:=$(wildcard*.o)xlanchen@2007.5.22EmbeddedOperatingSystems77makefile中的條件語(yǔ)句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendifxlanchen@2007.5.22EmbeddedOperatingSystems78四種條件語(yǔ)句ifeq...else...endififneq…else…endififndef…else…endififndef...else…endifxlanchen@2007.5.22EmbeddedOperatingSystems79實(shí)際項(xiàng)目中的makefile找到Linux或者uClinux源代碼中所有的makefile,分析它們的功能、相互關(guān)系。xlanchen@2007.5.22EmbeddedOperatingSystems803、GNUTools—ldld,TheGNULinker
Linux上常用的鏈接器ld軟件的作用是把各種目標(biāo)文件(.o文件)和庫(kù)文件鏈接在一起,并定位數(shù)據(jù)和函數(shù)地址,最終生成可執(zhí)行程序gcc可以間接的調(diào)用ld,使用gcc的-Wl參數(shù)可以傳遞參數(shù)給ld使用命令:ld--help可以列出ld常用的一些選項(xiàng)xlanchen@2007.5.22EmbeddedOperatingSystems81ld使用舉例(1)源程序編譯hello.c到hello.o命令:gcc-chello.cxlanchen@2007.5.22EmbeddedOperatingSystems82ld使用舉例(2)鏈接命令:ld–dynamic-linker/lib/ld-linux.so.2/usr/lib/crt1.o/usr/lib/crti.o/usr/lib/crtn.ohello.o–lc–ohello運(yùn)行./helloxlanchen@2007.5.22EmbeddedOperatingSystems83目標(biāo)文件ld通過(guò)BFD庫(kù)可以讀取和操作coff、elf、a.out等各種執(zhí)行文件格式的目標(biāo)文件BFD(BinaryFileDescriptor)目標(biāo)文件(objectfile)由多個(gè)節(jié)(section)組成,常見的節(jié)有:text節(jié)保存了可執(zhí)行代碼,data節(jié)保存了有初值的全局標(biāo)量,bss節(jié)保存了無(wú)初值的全局變量。xlanchen@2007.5.22EmbeddedOperatingSystems84使用objdump查看目標(biāo)文件的信息objdump–hhello.o比較hello
看看有什么不同?(作業(yè))xlanchen@2007.5.22EmbeddedOperatingSystems85鏈接描述文件(Linkerscript)可以使用鏈接描述文件控制ld的鏈接過(guò)程。鏈接描述文件,commandfile
又稱為鏈接腳本,Linkerscript用來(lái)控制ld的鏈接過(guò)程描述各輸入文件的各節(jié)如何映射到輸出文件的各節(jié)控制輸出文件中各個(gè)節(jié)或者符號(hào)的內(nèi)存布局使用的語(yǔ)言為:Theldcommandlanguage,鏈接命令語(yǔ)言xlanchen@2007.5.22EmbeddedOperatingSystems86ld命令的-Tcommandfile選項(xiàng)指定了鏈接描述文件名如果不指定鏈接描述文件,ld就會(huì)使用一個(gè)默認(rèn)的描述文件來(lái)產(chǎn)生執(zhí)行文件找到Linux或者uClinux中的鏈接描述文件并分析。(作業(yè))xlanchen@2007.5.22EmbeddedOperatingSystems87鏈接描述文件的命令鏈接描述文件的命令主要包括如下幾類:設(shè)置入口點(diǎn)命令處理文件的命令處理文件格式的命令其他xlanchen@2007.5.22EmbeddedOperatingSystems88常用的命令設(shè)置入口點(diǎn)格式:ENTRY(symbol)
設(shè)置symbol的值為執(zhí)行程序的入口點(diǎn)。ld有多種方法設(shè)置執(zhí)行程序的入口點(diǎn),確定程序入口點(diǎn)的順序如下:ld命令的-e選項(xiàng)指定的值Entry(symbol)指定的值.text節(jié)的起始地址入口點(diǎn)為0xlanchen@2007.5.22EmbeddedOperatingSystems89常用的命令I(lǐng)NCULDEfilename
包含其他filename的鏈接描述文件INPUT(file,file,…)
指定多個(gè)輸入文件名xlanchen@2007.5.22EmbeddedOperatingSystems90常用的命令OUTPUT_FORMAT(bfdname)
指定輸出文件的格式OUTPUT_ARCH(bfdname)指定目標(biāo)機(jī)器體系結(jié)構(gòu),例如:
OUTPUT_ARCH(arm)xlanchen@2007.5.22EmbeddedOperatingSystems91常用的命令MEMORY:
這個(gè)命令在用于嵌入式系統(tǒng)的鏈接描述文件中經(jīng)常出現(xiàn),它描述了各個(gè)內(nèi)存塊的起始地址和大小。格式如下:MEMORY{ name[(attr)]:ORIGIN=origin,LENGTH=len …}例如:xlanchen@2007.5.22EmbeddedOperatingSystems92Memory舉例xlanchen@2007.5.22EmbeddedOperatingSystems93SECTIONS命令SECTIONS
告訴ld如何把輸入文件的各個(gè)節(jié)映射到輸出文件的各個(gè)節(jié)中。在一個(gè)鏈接描述文件中只能有一個(gè)SECTIONS命令在SECTIONS命令中可以使用的命令有三種:定義入口點(diǎn)賦值定義輸出節(jié)xlanchen@2007.5.22EmbeddedOperatingSystems94定義輸出節(jié)SECTIONS
{
...
secname:
{
contents
}
...
}例如:xla
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廚房包間出租合同范例
- 壁燈低價(jià)出售合同范例
- 工程 安裝合同范例
- 培訓(xùn)講座合同范例
- 投資合同范例公章
- 土地耕種合同范例
- 施工合同及安全合同范例
- 商業(yè)空調(diào)工程合同范例
- 房屋賓館轉(zhuǎn)讓合同范例
- 建筑補(bǔ)償合同范例
- 2024年同等學(xué)力申碩英語(yǔ)考試真題
- GB/T 44625-2024動(dòng)態(tài)響應(yīng)同步調(diào)相機(jī)技術(shù)要求
- 倫理與社會(huì)責(zé)任智慧樹知到期末考試答案章節(jié)答案2024年浙江大學(xué)
- (高清版)JTGT 3610-2019 公路路基施工技術(shù)規(guī)范
- (正式版)SHT 3075-2024 石油化工鋼制壓力容器材料選用規(guī)范
- 2024年廣西交通投資集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 國(guó)開2023春《學(xué)前兒童語(yǔ)言教育》活動(dòng)指導(dǎo)形成性考核一二三四參考答案
- GB/T 9119-2010板式平焊鋼制管法蘭
- 作為設(shè)備科長(zhǎng),淺談怎么開展設(shè)備管理工作?
- 思想政治工作中人文關(guān)懷、心理疏導(dǎo)方式研究
- 核心網(wǎng)基礎(chǔ)知識(shí)
評(píng)論
0/150
提交評(píng)論