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

下載本文檔

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

文檔簡(jiǎn)介

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

“工欲善其事,必先利其器”

--《論語(yǔ)》2023/10/8EmbeddedOperatingSystems3/107主要內(nèi)容GNUTools簡(jiǎn)介GNUTools交叉開發(fā)環(huán)境及其安裝2023/10/8EmbeddedOperatingSystems4/107本地開發(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)不同。2023/10/8EmbeddedOperatingSystems5/107交叉開發(fā)平臺(tái)主機(jī):

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

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

其實(shí)GCC=GNUCompilerCollection目前,GCC可以支持多種高級(jí)語(yǔ)言,如C、C++ADAObjectCJAVAFortranPASCAL2023/10/8EmbeddedOperatingSystems9/107GCC下的工具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前端2023/10/8EmbeddedOperatingSystems10/107GNUTools—gccgcc是一個(gè)強(qiáng)大的工具集合,它包含了預(yù)處理器、編譯器、匯編器、鏈接器等組件。它會(huì)在需要的時(shí)候調(diào)用其他組件。

輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。對(duì)于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對(duì)嵌入式系統(tǒng)級(jí)的軟件開發(fā)非常重要2023/10/8EmbeddedOperatingSystems11/107gcc使用舉例(1)

源程序2023/10/8EmbeddedOperatingSystems12/107gcc使用舉例(2)

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

輸出文件的后綴為“.cpp” gcc–E–ogcctest.cppgcctest.c使用wc命令比較預(yù)處理后的文件與源文件,可以看到兩個(gè)文件的差異2023/10/8EmbeddedOperatingSystems17/107行數(shù)單詞數(shù)字節(jié)數(shù)預(yù)編譯2023/10/8EmbeddedOperatingSystems18/107預(yù)處理文件匯編代碼

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

2)使用-S說(shuō)明生成匯編代碼后停止工作gcc–xcpp-output–S–ogcctest.sgcctest.cpp也可以直接編譯到匯編代碼

gcc–Sgcctest.c2、編譯成匯編代碼2023/10/8EmbeddedOperatingSystems19/107預(yù)處理文件匯編代碼直接編譯到匯編代碼s2023/10/8EmbeddedOperatingSystems20/1073、編譯成目標(biāo)代碼匯編代碼目標(biāo)代碼

gcc–xassembler–cgcctest.s直接編譯成目標(biāo)代碼

gcc–cgcctest.c使用匯編器生成目標(biāo)代碼as–ogcctest.ogcctest.s2023/10/8EmbeddedOperatingSystems21/107匯編代碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器2023/10/8EmbeddedOperatingSystems22/1074、編譯成執(zhí)行代碼目標(biāo)代碼執(zhí)行代碼

gcc–ogcctestgcctest.o直接生成執(zhí)行代碼

gcc–ogcctestgcctest.c2023/10/8EmbeddedOperatingSystems23/107目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼2023/10/8EmbeddedOperatingSystems24/107gcc的高級(jí)選項(xiàng)-Wall:打開所有的警告信息2023/10/8EmbeddedOperatingSystems25/107根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應(yīng)當(dāng)返回一個(gè)值2023/10/8EmbeddedOperatingSystems26/107修改源程序2023/10/8EmbeddedOperatingSystems27/107優(yōu)化編譯優(yōu)化編譯選項(xiàng)有:-O0

缺省情況,不優(yōu)化-O1-O2-O3等等不同程度的優(yōu)化2023/10/8EmbeddedOperatingSystems28/107gcc的優(yōu)化編譯舉例(1)

考慮如下的源代碼不同的優(yōu)化編譯選項(xiàng)2023/10/8EmbeddedOperatingSystems29/107gcc的優(yōu)化編譯舉例(2)

使用time命令統(tǒng)計(jì)程序的運(yùn)行2023/10/8EmbeddedOperatingSystems30/107二、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)容。2023/10/8EmbeddedOperatingSystems31/107as

是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。2023/10/8EmbeddedOperatingSystems32/107nm

列出目標(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

顯示elf格式可執(zhí)行文件的信息。2023/10/8EmbeddedOperatingSystems33/107size

列出目標(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)。2023/10/8EmbeddedOperatingSystems34/107libiberty

包含許多GNU程序都會(huì)用到的函數(shù),這些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd

二進(jìn)制文件描述庫(kù).libopcodes

用來(lái)處理opcodes的庫(kù),在生成一些應(yīng)用程序的時(shí)候也會(huì)用到它,比如objdump.Opcodes是文本格式可讀的處理器操作指令.2023/10/8EmbeddedOperatingSystems35/107binutils開發(fā)工具使用舉例arnmObjcopyObjdumpreadelf2023/10/8EmbeddedOperatingSystems36/1071、arar用于建立、修改、提取歸檔文件(archive),一個(gè)歸檔文件,是包含多個(gè)被包含文件的單個(gè)文件(也可以認(rèn)為歸檔文件是一個(gè)庫(kù)文件)。被包含的原始文件的內(nèi)容、權(quán)限、時(shí)間戳、所有者等屬性都保存在歸檔文件中,并且在提取之后可以還原2023/10/8EmbeddedOperatingSystems37/107使用ar建立庫(kù)文件(1)源程序add.c和minus.c2023/10/8EmbeddedOperatingSystems38/107使用ar建立庫(kù)文件(2)編譯成目標(biāo)文件將庫(kù)文件拷貝到/usr/lib目錄下Ar的rv參數(shù)的說(shuō)明:

r:將多個(gè)文件組成一個(gè)文件

v:輸出信息建立庫(kù)文件2023/10/8EmbeddedOperatingSystems39/107庫(kù)文件使用舉例

在代碼中使用Add和Minus函數(shù)2023/10/8EmbeddedOperatingSystems40/107在編譯時(shí)指定庫(kù)文件指明將libtest.a鏈接進(jìn)來(lái)運(yùn)行結(jié)果2023/10/8EmbeddedOperatingSystems41/1072、nmnm的主要功能是列出目標(biāo)文件中的符號(hào),這樣程序員就可以定位和分析執(zhí)行程序和目標(biāo)文件中的符號(hào)信息和它的屬性2023/10/8EmbeddedOperatingSystems42/107nm顯示的符號(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)文件格式特殊 2023/10/8EmbeddedOperatingSystems43/107nm使用舉例如果對(duì)test可執(zhí)行文件使用nm,會(huì)有什么結(jié)果呢?(作業(yè))2023/10/8EmbeddedOperatingSystems44/1073、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文件2023/10/8EmbeddedOperatingSystems45/107Objcopy使用舉例使用file命令查看文件類型生成srec格式的目標(biāo)文件使用file命令查看新文件的類型2023/10/8EmbeddedOperatingSystems46/107文件格式a.out:

assemblerandlinkeditoroutput

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

commonobjectfileformat

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

excutivelinkedfile

Linux系統(tǒng)所采用的一種通用文件格式,支持動(dòng)態(tài)連接。ELF格式可以比COFF格式包含更多的調(diào)試信息2023/10/8EmbeddedOperatingSystems47/107文件格式Flat

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

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

MOTOROLAS-Recoder格式(S記錄格式文件)等等2023/10/8EmbeddedOperatingSystems48/1074、objdump顯示一個(gè)或多個(gè)目標(biāo)文件的信息,由其選項(xiàng)來(lái)控制顯示哪些信息。一般來(lái)說(shuō),objdump只對(duì)那些要編寫編譯工具的程序員有幫助,但是我們通過(guò)這個(gè)工具可以方便的查看執(zhí)行文件或者庫(kù)文件的信息2023/10/8EmbeddedOperatingSystems49/107Objdump使用舉例(1)-f選項(xiàng):顯示文件頭中的內(nèi)容2023/10/8EmbeddedOperatingSystems50/107Objdump使用舉例(2)-d選項(xiàng)進(jìn)行反匯編2023/10/8EmbeddedOperatingSystems51/1075、readelfreadelf:

顯示一個(gè)或多個(gè)ELF格式的目標(biāo)文件信息。2023/10/8EmbeddedOperatingSystems52/107Readelf使用舉例2023/10/8EmbeddedOperatingSystems53/107三、其他GNU工具Gdb—調(diào)試器GNUmake--軟件工程工具diff,patch--補(bǔ)丁工具CVS--版本控制系統(tǒng)2023/10/8EmbeddedOperatingSystems54/1071、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的調(diào)試器,功能強(qiáng)大設(shè)置斷點(diǎn)監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值堆棧查看遠(yuǎn)程調(diào)試2023/10/8EmbeddedOperatingSystems55/107gdb使用舉例源代碼如下編譯:gcc–obugbug.c2023/10/8EmbeddedOperatingSystems56/107編譯并運(yùn)行????編譯2023/10/8EmbeddedOperatingSystems57/107使用gdb調(diào)試bug

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

即有關(guān)哪些文件的最新版本是依賴于哪些別的文件產(chǎn)生或者組成的2)需要用什么命令來(lái)產(chǎn)生目標(biāo)文件的最新版本3)以及一些其他的功能2023/10/8EmbeddedOperatingSystems64/107Makefile的規(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)文件的命令組2023/10/8EmbeddedOperatingSystems65/107規(guī)則一般形式target...:prerequisites...<tab>command

<tab>...<tab>...例如test:test.c;gcc–O–otesttest.c2023/10/8EmbeddedOperatingSystems66/107一個(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.o2023/10/8EmbeddedOperatingSystems67/107Make的工作過(guò)程defaultgoal

在缺省的情況下,make從makefile中的第一個(gè)目標(biāo)開始執(zhí)行Make的工作過(guò)程類似一次深度優(yōu)先遍歷過(guò)程2023/10/8EmbeddedOperatingSystems68/107Makefile中的變量使用變量可以降低錯(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)2023/10/8EmbeddedOperatingSystems69/107有點(diǎn)像環(huán)境變量環(huán)境變量在make過(guò)程中被解釋成make的變量可以被用來(lái)貯存一個(gè)文件名列表。貯存可執(zhí)行文件名。如用變量代替編譯器名。貯存編譯器FLAG2023/10/8EmbeddedOperatingSystems70/107預(yù)定義變量Make使用了許多預(yù)定義的變量,如ARASCCCXXCFLAGSCPPFLAGS等等2023/10/8EmbeddedOperatingSystems71/107簡(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)2023/10/8EmbeddedOperatingSystems72/107內(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$@2023/10/8EmbeddedOperatingSystems73/107隱含規(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$@2023/10/8EmbeddedOperatingSystems74/107設(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:prog1prog22023/10/8EmbeddedOperatingSystems75/107典型的設(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命令2023/10/8EmbeddedOperatingSystems76/107Makefile中的函數(shù)(Functions)用來(lái)計(jì)算出要操作的文件、目標(biāo)或者要執(zhí)行的命令使用方法:$(functionarguments)典型的函數(shù)$(substfrom,to,text)$(substee,EE,feetonthestreet)相當(dāng)于`fEEtonthestrEEt'2023/10/8EmbeddedOperatingSystems77/107$(patsubst

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

pattern)$(wildcard*.c)objects:=$(wildcard*.o)2023/10/8EmbeddedOperatingSystems78/107makefile中的條件語(yǔ)句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendif2023/10/8EmbeddedOperatingSystems79/107四種條件語(yǔ)句ifeq...else...endififneq…else…endififndef…else…endififndef...else…endif2023/10/8EmbeddedOperatingSystems80/107實(shí)際項(xiàng)目中的makefile找到Linux或者uClinux源代碼中所有的makefile,分析它們的功能、相互關(guān)系。2023/10/8EmbeddedOperatingSystems81/1073、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)2023/10/8EmbeddedOperatingSystems82/107ld使用舉例(1)源程序編譯hello.c到hello.o命令:gcc-chello.c2023/10/8EmbeddedOperatingSystems83/107ld使用舉例(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)行./hello2023/10/8EmbeddedOperatingSystems84/107目標(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ú)初值的全局變量。2023/10/8EmbeddedOperatingSystems85/107使用objdump查看目標(biāo)文件的信息objdump–hhello.o比較hello

2023/10/8EmbeddedOperatingSystems86/107鏈接描述文件(Linkerscript)可以使用鏈接描述文件控制ld的鏈接過(guò)程。鏈接描述文件,commandfile

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

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

指定多個(gè)輸入文件名2023/10/8EmbeddedOperatingSystems91/107常用的命令OUTPUT_FORMAT(bfdname)

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

OUTPUT_ARCH(arm)2023/10/8EmbeddedOperatingSystems92/107常用的命令MEMORY:

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

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

{

...

secname:

{

contents

}

...

}例如:2023/10/8EmbeddedOperatingSystems96/107定位計(jì)數(shù)器定位計(jì)數(shù)器,TheLocationCounter一個(gè)特殊的ld變量,使用“.”表示總是在SECTIONS中使用例如:2023/10/8EmbeddedOperatingSystems97/107一個(gè)簡(jiǎn)單例子下面是一個(gè)簡(jiǎn)單的例子:

例中,輸出文件包含text,data,bss三個(gè)節(jié),而輸入文件也只包含這3個(gè)節(jié):SECTIONS{ .=0x01000000; .text:{*(.text)}; .=0x08000000; .data:{*(.data)}; .bss:{*(

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論