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

下載本文檔

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

文檔簡(jiǎn)介

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

“工欲善其事,必先利其器”--《論語(yǔ)》GNU開(kāi)發(fā)工具鏈介紹 主要內(nèi)容GNUTools簡(jiǎn)介GNUTools交叉開(kāi)發(fā)環(huán)境及其安裝9/2/20233EmbeddedOperatingSystems主要內(nèi)容GNUTools簡(jiǎn)介8/3/20233Embedd本地開(kāi)發(fā)vs交叉平臺(tái)開(kāi)發(fā)本地開(kāi)發(fā):

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

本課程所涉及到的嵌入式系統(tǒng)開(kāi)發(fā)屬于交叉平臺(tái)開(kāi)發(fā),也就是說(shuō)開(kāi)發(fā)軟件的系統(tǒng)與運(yùn)行軟件的系統(tǒng)不同。9/2/20234EmbeddedOperatingSystems本地開(kāi)發(fā)vs交叉平臺(tái)開(kāi)發(fā)本地開(kāi)發(fā):

一般軟件的開(kāi)發(fā)屬于本交叉開(kāi)發(fā)平臺(tái)主機(jī):

開(kāi)發(fā)軟件的平臺(tái),稱(chēng)為主機(jī),往往是通用電腦;目標(biāo)機(jī):

運(yùn)行軟件的平臺(tái),稱(chēng)為目標(biāo)機(jī),在這里是嵌入式系統(tǒng)。9/2/20235EmbeddedOperatingSystems交叉開(kāi)發(fā)平臺(tái)主機(jī):

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

其實(shí)GCC=GNUCompilerCollection目前,GCC可以支持多種高級(jí)語(yǔ)言,如C、C++ADAObjectCJAVAFortranPASCAL9/2/20238EmbeddedOperatingSystems一、GCC很多人認(rèn)為GCC只是一個(gè)C編譯器,

其實(shí)GCC=GCC下的工具cpp—預(yù)處理器

GNUC編譯器在編譯前自動(dòng)使用cpp對(duì)用戶(hù)程序進(jìn)行預(yù)處理gcc—符合ISO等標(biāo)準(zhǔn)的C編譯器g++—基本符合ISO標(biāo)準(zhǔn)的C++編譯器gcj—GCC的java前端gnat—GCC的GNUADA95前端9/2/20239EmbeddedOperatingSystemsGCC下的工具cpp—預(yù)處理器

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

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

源程序9/2/202311EmbeddedOperatingSystemsgcc使用舉例(1)

源程序8/3/202311Embeddgcc使用舉例(2)

編譯和運(yùn)行編譯運(yùn)行9/2/202312EmbeddedOperatingSystemsgcc使用舉例(2)

編譯和運(yùn)行編譯運(yùn)行8/3/202312gcc的工作過(guò)程(1)如果使用-v選項(xiàng),則可以看到許多被隱藏的信息9/2/202313EmbeddedOperatingSystemsgcc的工作過(guò)程(1)如果使用-v選項(xiàng),則可以看到許多被隱藏9/2/202314EmbeddedOperatingSystems8/3/202314EmbeddedOperatingSgcc的編譯過(guò)程一般情況下,c程序的編譯過(guò)程為1、預(yù)處理2、編譯成匯編代碼3、匯編成目標(biāo)代碼4、鏈接9/2/202315EmbeddedOperatingSystemsgcc的編譯過(guò)程一般情況下,c程序的編譯過(guò)程為8/3/2021、預(yù)處理預(yù)處理:使用-E參數(shù)

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

輸出文件的后綴為“.cpp”行數(shù)單詞數(shù)字節(jié)數(shù)預(yù)編譯9/2/202317EmbeddedOperatingSystems行數(shù)單詞數(shù)字節(jié)數(shù)預(yù)編譯8/3/202317Embedde預(yù)處理文件匯編代碼

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

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

1)使用-x參數(shù)說(shuō)明根據(jù)指定的步驟進(jìn)行預(yù)處理文件匯編代碼直接編譯到匯編代碼s9/2/202319EmbeddedOperatingSystems預(yù)處理文件匯編代碼直接編譯到匯編代碼s8/3/2023193、編譯成目標(biāo)代碼匯編代碼目標(biāo)代碼 gcc–xassembler–cgcctest.s直接編譯成目標(biāo)代碼 gcc–cgcctest.c使用匯編器生成目標(biāo)代碼as–ogcctest.ogcctest.s9/2/202320EmbeddedOperatingSystems3、編譯成目標(biāo)代碼匯編代碼目標(biāo)代碼8/3/202320Em匯編代碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器9/2/202321EmbeddedOperatingSystems匯編代碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器8/3/2024、編譯成執(zhí)行代碼目標(biāo)代碼執(zhí)行代碼 gcc–ogcctestgcctest.o直接生成執(zhí)行代碼 gcc–ogcctestgcctest.c9/2/202322EmbeddedOperatingSystems4、編譯成執(zhí)行代碼目標(biāo)代碼執(zhí)行代碼8/3/202322Em目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼9/2/202323EmbeddedOperatingSystems目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼8/3/202323Embgcc的高級(jí)選項(xiàng)-Wall:打開(kāi)所有的警告信息9/2/202324EmbeddedOperatingSystemsgcc的高級(jí)選項(xiàng)-Wall:打開(kāi)所有的警告信息8/3/202根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應(yīng)當(dāng)返回一個(gè)值9/2/202325EmbeddedOperatingSystems根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末修改源程序9/2/202326EmbeddedOperatingSystems修改源程序8/3/202326EmbeddedOperat優(yōu)化編譯優(yōu)化編譯選項(xiàng)有:-O0

缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化9/2/202327EmbeddedOperatingSystems優(yōu)化編譯優(yōu)化編譯選項(xiàng)有:不同程度的優(yōu)化8/3/202327Egcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化編譯選項(xiàng)9/2/202328EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(1)

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

使用time命令統(tǒng)計(jì)程序的運(yùn)行9/2/202329EmbeddedOperatingSystemsgcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計(jì)程序的運(yùn)行8二、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)容。9/2/202330EmbeddedOperatingSystems二、GNUbinutilsbinutils是一組二進(jìn)制工具as是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。9/2/202331EmbeddedOperatingSystemsas是GNU匯編器,主要用來(lái)編譯GNUC編譯器gcc輸出nm列出目標(biāo)文件中的符號(hào)。objcopy把一種目標(biāo)文件中的內(nèi)容復(fù)制到另一種類(lèi)型的目標(biāo)文件中.objdump顯示一個(gè)或者更多目標(biāo)文件的信息。使用選項(xiàng)來(lái)控制其顯示的信息。它所顯示的信息通常只有編寫(xiě)編譯工具的人才感興趣。ranlib產(chǎn)生歸檔文件索引,并將其保存到這個(gè)歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標(biāo)文件。readelf顯示elf格式可執(zhí)行文件的信息。9/2/202332EmbeddedOperatingSystemsnm列出目標(biāo)文件中的符號(hào)。8/3/202332Embeddsize列出目標(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ì)于其它類(lèi)型的文件它打印整個(gè)文件的可打印字符,這個(gè)程序?qū)τ诹私夥俏谋疚募膬?nèi)容很有幫助。strip丟棄目標(biāo)文件中的全部或者特定符號(hào)。9/2/202333EmbeddedOperatingSystemssize列出目標(biāo)文件每一段的大小以及總體的大小。默認(rèn)情況下libiberty包含許多GNU程序都會(huì)用到的函數(shù),這些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd二進(jìn)制文件描述庫(kù).libopcodes用來(lái)處理opcodes的庫(kù),在生成一些應(yīng)用程序的時(shí)候也會(huì)用到它,比如objdump.Opcodes是文本格式可讀的處理器操作指令.9/2/202334EmbeddedOperatingSystemslibiberty包含許多GNU程序都會(huì)用到的函數(shù),這些binutils開(kāi)發(fā)工具使用舉例arnmObjcopyObjdumpreadelf9/2/202335EmbeddedOperatingSystemsbinutils開(kāi)發(fā)工具使用舉例ar8/3/202335Em1、arar用于建立、修改、提取歸檔文件(archive),一個(gè)歸檔文件,是包含多個(gè)被包含文件的單個(gè)文件(也可以認(rèn)為歸檔文件是一個(gè)庫(kù)文件)。被包含的原始文件的內(nèi)容、權(quán)限、時(shí)間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原9/2/202336EmbeddedOperatingSystems1、arar用于建立、修改、提取歸檔文件(archive),使用ar建立庫(kù)文件(1)源程序add.c和minus.c9/2/202337EmbeddedOperatingSystems使用ar建立庫(kù)文件(1)源程序add.c和minus.c8/使用ar建立庫(kù)文件(2)編譯成目標(biāo)文件將庫(kù)文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說(shuō)明: r:將多個(gè)文件組成一個(gè)文件 v:輸出信息建立庫(kù)文件9/2/202338EmbeddedOperatingSystems使用ar建立庫(kù)文件(2)編譯成目標(biāo)文件將庫(kù)文件拷貝到/usr庫(kù)文件使用舉例

在代碼中使用Add和Minus函數(shù)9/2/202339EmbeddedOperatingSystems庫(kù)文件使用舉例

在代碼中使用Add和Minus函數(shù)8/3/2在編譯時(shí)指定庫(kù)文件指明將libtest.a鏈接進(jìn)來(lái)運(yùn)行結(jié)果9/2/202340EmbeddedOperatingSystems在編譯時(shí)指定庫(kù)文件指明將libtest.a鏈接進(jìn)來(lái)運(yùn)行結(jié)果82、nmnm的主要功能是列出目標(biāo)文件中的符號(hào),這樣程序員就可以定位和分析執(zhí)行程序和目標(biāo)文件中的符號(hào)信息和它的屬性9/2/202341EmbeddedOperatingSystems2、nmnm的主要功能是列出目標(biāo)文件中的符號(hào),這樣程序員就可nm顯示的符號(hào)類(lèi)型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)類(lèi)型未知,或者目標(biāo)文件格式特殊 9/2/202342EmbeddedOperatingSystemsnm顯示的符號(hào)類(lèi)型A:符號(hào)的值是絕對(duì)值,并且不會(huì)被將來(lái)的鏈接nm使用舉例如果對(duì)test可執(zhí)行文件使用nm,會(huì)有什么結(jié)果呢?(作業(yè))9/2/202343EmbeddedOperatingSystemsnm使用舉例如果對(duì)test可執(zhí)行文件使用nm,8/3/2023、objcopy可以將一種格式的目標(biāo)文件內(nèi)容進(jìn)行轉(zhuǎn)換,并輸出為另一種格式的目標(biāo)文件。它使用GNUBFD(binaryformatdescription)庫(kù)讀/寫(xiě)目標(biāo)文件,通過(guò)這個(gè)BFD庫(kù),objcopy能以一種不同于源目標(biāo)文件的格式生成新的目標(biāo)文件$objcopy-h在makefile里面用-Obinary選項(xiàng)來(lái)生成原始的二進(jìn)制文件,即通常說(shuō)的image文件9/2/202344EmbeddedOperatingSystems3、objcopy可以將一種格式的目標(biāo)文件內(nèi)容進(jìn)行轉(zhuǎn)換,并輸Objcopy使用舉例使用file命令查看文件類(lèi)型生成srec格式的目標(biāo)文件使用file命令查看新文件的類(lèi)型9/2/202345EmbeddedOperatingSystemsObjcopy使用舉例使用file命令查看文件類(lèi)型生成sre文件格式a.out:

assemblerandlinkeditoroutput

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

commonobjectfileformat

一種通用的對(duì)象文件格式ELF

excutivelinkedfile

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

assemblerandlink文件格式Flat

elf格式有很大的文件頭,flat文件對(duì)文件頭和一些段信息做了簡(jiǎn)化

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

MOTOROLAS-Recoder格式(S記錄格式文件)等等9/2/202347EmbeddedOperatingSystems文件格式Flat

elf格式有很大的文件頭,flat文件對(duì)文4、objdump顯示一個(gè)或多個(gè)目標(biāo)文件的信息,由其選項(xiàng)來(lái)控制顯示哪些信息。一般來(lái)說(shuō),objdump只對(duì)那些要編寫(xiě)編譯工具的程序員有幫助,但是我們通過(guò)這個(gè)工具可以方便的查看執(zhí)行文件或者庫(kù)文件的信息9/2/202348EmbeddedOperatingSystems4、objdump顯示一個(gè)或多個(gè)目標(biāo)文件的信息,由其選項(xiàng)來(lái)控Objdump使用舉例(1)-f選項(xiàng):顯示文件頭中的內(nèi)容9/2/202349EmbeddedOperatingSystemsObjdump使用舉例(1)-f選項(xiàng):顯示文件頭中的內(nèi)容8/Objdump使用舉例(2)-d選項(xiàng)進(jìn)行反匯編9/2/202350EmbeddedOperatingSystemsObjdump使用舉例(2)-d選項(xiàng)進(jìn)行反匯編8/3/2025、readelfreadelf:

顯示一個(gè)或多個(gè)ELF格式的目標(biāo)文件信息。9/2/202351EmbeddedOperatingSystems5、readelfreadelf:

顯示一個(gè)或多個(gè)ELF格式Readelf使用舉例9/2/202352EmbeddedOperatingSystemsReadelf使用舉例8/3/202352Embedded三、其他GNU工具Gdb—調(diào)試器GNUmake--軟件工程工具diff,patch--補(bǔ)丁工具CVS--版本控制系統(tǒng)9/2/202353EmbeddedOperatingSystems三、其他GNU工具Gdb—調(diào)試器8/3/202353Embe1、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的調(diào)試器,功能強(qiáng)大設(shè)置斷點(diǎn)監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠(yuǎn)程調(diào)試9/2/202354EmbeddedOperatingSystems1、GNUToolchain—gdbGdb=GNUgdb使用舉例源代碼如下編譯:gcc–obugbug.c9/2/202355EmbeddedOperatingSystemsgdb使用舉例源代碼如下編譯:8/3/202355Embed編譯并運(yùn)行????編譯9/2/202356EmbeddedOperatingSystems編譯并運(yùn)行????編譯8/3/202356Embedded使用gdb調(diào)試bug

運(yùn)行bug輸入字符串hello顯示出錯(cuò)位置能不能看到源代碼呢?9/2/202357EmbeddedOperatingSystems使用gdb調(diào)試bug

運(yùn)行bug輸入字符串hello顯示出錯(cuò)使用gcc的-g參數(shù)gcc–g–obugbug.c重新調(diào)試列出源代碼9/2/202358EmbeddedOperatingSystems使用gcc的-g參數(shù)gcc–g–obugbug.c列?怎么修改前面的源代碼呢?設(shè)置斷點(diǎn)9/2/202359EmbeddedOperatingSystems?怎么修改前面的源代碼呢?設(shè)置斷點(diǎn)8/3/202359Emb2、使用GNUmake管理項(xiàng)目GNUmake是一種代碼維護(hù)工具,在使用GNU編譯器開(kāi)發(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ù)和代碼生成工作。9/2/202360EmbeddedOperatingSystems2、使用GNUmake管理項(xiàng)目GNUmake是一種代碼維Make可以識(shí)別出makefile中哪些文件已經(jīng)被修改,并且在再次編譯的時(shí)候只編譯這些文件,從而提高編譯的效率Make會(huì)檢查文件的修改和生成時(shí)間戳,如果目標(biāo)文件的修改或者生成時(shí)間戳比它的任意一個(gè)依賴(lài)文件舊,則make就執(zhí)行makefile文件中描述的相應(yīng)命令,以便更新目的文件只更新那些需要更新的文件,而不重新處理那些并不過(guò)時(shí)的文件9/2/202361EmbeddedOperatingSystemsMake可以識(shí)別出makefile中哪些文件已經(jīng)被修改,并且特點(diǎn):適合于支持多文件構(gòu)成的大中型軟件項(xiàng)目的編譯,鏈接,清除中間文件等管理工作提供和識(shí)別多種默認(rèn)規(guī)則,方便對(duì)大型軟件項(xiàng)目的管理支持對(duì)多目錄的軟件項(xiàng)目進(jìn)行遞歸管理對(duì)軟件項(xiàng)目具有很好的可維護(hù)性和擴(kuò)展性9/2/202362EmbeddedOperatingSystems特點(diǎn):8/3/202362EmbeddedOperatinmakefileMakefile告訴make該做什么、怎么做makefile主要定義了1)依賴(lài)關(guān)系

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

一條規(guī)則包含3個(gè)方面的內(nèi)容,1)要?jiǎng)?chuàng)建的目標(biāo)(文件),2)創(chuàng)建目標(biāo)(文件)所依賴(lài)的文件列表;3)通過(guò)依賴(lài)文件創(chuàng)建目標(biāo)文件的命令組9/2/202364EmbeddedOperatingSystemsMakefile的規(guī)則規(guī)則

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

<tab>...<tab>...例如test:test.c;gcc–O–otesttest.c9/2/202365EmbeddedOperatingSystems規(guī)則一般形式8/3/202365EmbeddedOpera一個(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.o9/2/202366EmbeddedOperatingSystems一個(gè)簡(jiǎn)單的makefile

edit:main.okbMake的工作過(guò)程defaultgoal

在缺省的情況下,make從makefile中的第一個(gè)目標(biāo)開(kāi)始執(zhí)行Make的工作過(guò)程類(lèi)似一次深度優(yōu)先遍歷過(guò)程9/2/202367EmbeddedOperatingSystemsMake的工作過(guò)程defaultgoal

在缺省的情況下,Makefile中的變量使用變量可以降低錯(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)9/2/202368EmbeddedOperatingSystemsMakefile中的變量使用變量可以8/3/202368E有點(diǎn)像環(huán)境變量環(huán)境變量在make過(guò)程中被解釋成make的變量可以被用來(lái)貯存一個(gè)文件名列表。貯存可執(zhí)行文件名。如用變量代替編譯器名。貯存編譯器FLAG9/2/202369EmbeddedOperatingSystems有點(diǎn)像環(huán)境變量8/3/202369EmbeddedOper預(yù)定義變量Make使用了許多預(yù)定義的變量,如ARASCCCXXCFLAGSCPPFLAGS等等9/2/202370EmbeddedOperatingSystems預(yù)定義變量Make使用了許多預(yù)定義的變量,如8/3/2023簡(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)9/2/202371EmbeddedOperatingSystems簡(jiǎn)化后的makefile文件

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

CC=gcc

CFLAGS=-Wall-O-g

foo.o:foo.cfoo.hbar.h

$(CC)$(CFLAGS)-c$<-o$@9/2/202372EmbeddedOperatingSystems內(nèi)部變量$@擴(kuò)展成當(dāng)前規(guī)則的目的文件名8/3/202372E隱含規(guī)則(ImplicitRules)內(nèi)置的規(guī)則告訴make當(dāng)沒(méi)有給出某些命令的時(shí)候,應(yīng)該怎么辦。用戶(hù)可以使用預(yù)定義的變量改變隱含規(guī)則的工作方式,如一個(gè)C編譯的具體命令將會(huì)是:$(CC)$(CFLAGS)$(CPPFLAGS)$(TARGET_ARCH)-c$<-o$@9/2/202373EmbeddedOperatingSystems隱含規(guī)則(ImplicitRules)內(nèi)置的規(guī)則8/3/設(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:prog1prog29/2/202374EmbeddedOperatingSystems設(shè)定目標(biāo)(PhonyTargets)設(shè)定目標(biāo)8/3/202典型的設(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命令9/2/202375EmbeddedOperatingSystems典型的設(shè)定目標(biāo)設(shè)定目的也可以用來(lái)描述一些其他的動(dòng)作。例如,想Makefile中的函數(shù)(Functions)用來(lái)計(jì)算出要操作的文件、目標(biāo)或者要執(zhí)行的命令使用方法:$(functionarguments)典型的函數(shù)$(substfrom,to,text)$(substee,EE,feetonthestreet)相當(dāng)于`fEEtonthestrEEt'9/2/202376EmbeddedOperatingSystemsMakefile中的函數(shù)(Functions)用來(lái)計(jì)算出要$(patsubst

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

pattern)$(wildcard*.c)objects:=$(wildcard*.o)9/2/202377EmbeddedOperatingSystems$(patsubstpattern,replacementmakefile中的條件語(yǔ)句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendif9/2/202378EmbeddedOperatingSystemsmakefile中的條件語(yǔ)句conditional-dire四種條件語(yǔ)句ifeq...else...endififneq…else…endififndef…else…endififndef...else…endif9/2/202379EmbeddedOperatingSystems四種條件語(yǔ)句ifeq...else...endif8/3/2實(shí)際項(xiàng)目中的makefile找到Linux或者uClinux源代碼中所有的makefile,分析它們的功能、相互關(guān)系。9/2/202380EmbeddedOperatingSystems實(shí)際項(xiàng)目中的makefile找到Linux或者uClinux3、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)9/2/202381EmbeddedOperatingSystems3、GNUTools—ldld,TheGNULinkeld使用舉例(1)源程序編譯hello.c到hello.o命令:gcc-chello.c9/2/202382EmbeddedOperatingSystemsld使用舉例(1)源程序8/3/202382Embeddedld使用舉例(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)行./hello9/2/202383EmbeddedOperatingSystemsld使用舉例(2)鏈接8/3/202383Embedded目標(biāo)文件ld通過(guò)BFD庫(kù)可以讀取和操作coff、elf、a.out等各種執(zhí)行文件格式的目標(biāo)文件BFD(BinaryFileDescriptor)目標(biāo)文件(objectfile)由多個(gè)節(jié)(section)組成,常見(jiàn)的節(jié)有:text節(jié)保存了可執(zhí)行代碼,data節(jié)保存了有初值的全局標(biāo)量,bss節(jié)保存了無(wú)初值的全局變量。9/2/202384EmbeddedOperatingSystems目標(biāo)文件ld通過(guò)BFD庫(kù)可以讀取和操作coff、elf、a.使用objdump查看目標(biāo)文件的信息objdump–hhello.o比較hello

9/2/202385EmbeddedOperatingSystems使用objdump查看目標(biāo)文件的信息8/3/202385Em鏈接描述文件(Linkerscript)可以使用鏈接描述文件控制ld的鏈接過(guò)程。鏈接描述文件,commandfile

又稱(chēng)為鏈接腳本,Linkerscript用來(lái)控制ld的鏈接過(guò)程描述各輸入文件的各節(jié)如何映射到輸出文件的各節(jié)控制輸出文件中各個(gè)節(jié)或者符號(hào)的內(nèi)存布局使用的語(yǔ)言為:Theldcommandlanguage,鏈接命令語(yǔ)言9/2/202386EmbeddedOperatingSystems鏈接描述文件(Linkerscript)可以使用鏈接描ld命令的-Tcommandfile選項(xiàng)指定了鏈接描述文件名如果不指定鏈接描述文件,ld就會(huì)使用一個(gè)默認(rèn)的描述文件來(lái)產(chǎn)生執(zhí)行文件找到Linux或者uClinux中的鏈接描述文件并分析。9/2/202387EmbeddedOperatingSystemsld命令的-Tcommandfile選項(xiàng)指定了鏈接描述文件鏈接描述文件的命令鏈接描述文件的命令主要包括如下幾類(lèi):設(shè)置入口點(diǎn)命令處理文件的命令處理文件格式的命令其他9/2/202388EmbeddedOperatingSystems鏈接描述文件的命令鏈接描述文件的命令主要包括如下幾類(lèi):8/3常用的命令設(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)為09/2/202389EmbeddedOperatingSystems常用的命令設(shè)置入口點(diǎn)8/3/202389EmbeddedO常用的命令I(lǐng)NCULDEfilename

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

指定多個(gè)輸入文件名9/2/202390EmbeddedOperatingSystems常用的命令I(lǐng)NCULDEfilename

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

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

OUTPUT_ARCH(arm)9/2/202391EmbeddedOperatingSystems常用的命令OUTPUT_FORMAT(bfdname)

指定常用的命令MEMORY:

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

這個(gè)命令在用于嵌入式系統(tǒng)的鏈接描述Memory舉例9/2/202393EmbeddedOperatingSystemsMemory舉例8/3/202393EmbeddedOpeSECTIONS命令SECTIONS

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

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

{

...

secname:

{

contents

}

...

}例如:9/2/202395EmbeddedOperatingSystems定義輸出節(jié)SECTIONS

{

...

secname定位計(jì)數(shù)器定位計(jì)數(shù)器,TheLocationCounter一個(gè)特殊的ld變量,使用“.”表示總是在SECTIONS中使用例如:9/2/202396EmbeddedOperatingSystems定位計(jì)數(shù)器定位計(jì)數(shù)器,TheLocationCounte一個(gè)簡(jiǎn)單例子下面是一個(gè)簡(jiǎn)單的例子:

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

例中,輸出文件包含texSECTIONS舉例(對(duì)應(yīng)于上面

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論