ch3-程序的執(zhí)行過(guò)程_2017227142222739_第1頁(yè)
ch3-程序的執(zhí)行過(guò)程_2017227142222739_第2頁(yè)
ch3-程序的執(zhí)行過(guò)程_2017227142222739_第3頁(yè)
ch3-程序的執(zhí)行過(guò)程_2017227142222739_第4頁(yè)
ch3-程序的執(zhí)行過(guò)程_2017227142222739_第5頁(yè)
已閱讀5頁(yè),還剩38頁(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)介

1、Ch3 程序編譯的過(guò)程GCCEmbedded System Lab Spring 2017程序編譯的過(guò)程 GCC=一個(gè)C編譯器?其實(shí)GCC = GNU Compiler Collection 目前,GCC可以支持多種高級(jí)語(yǔ)言,如 C、C+ ADA Object C JAVA Fortran PASCALGCC下的工具 cpp 預(yù)處理器GNU C編譯器在編譯前自動(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的GNU ADA 95前端GNU Toolsgcc gcc是一個(gè)強(qiáng)大的工具集合,它包

2、含了預(yù)處理器、編譯器、匯編器、鏈接器等組件。它會(huì)在需要的時(shí)候調(diào)用其他組件。輸入文件的類型和傳遞給gcc的參數(shù)決定了gcc調(diào)用具體的哪些組件。 對(duì)于開發(fā)者,它提供的足夠多的參數(shù),可以讓開發(fā)者全面控制代碼的生成,這對(duì)嵌入式系統(tǒng)級(jí)的軟件開發(fā)非常重要 gcc -helpLinuxgcc使用舉例(1)源程序gcc使用舉例(2)編譯和運(yùn)行編譯運(yùn)行g(shù)cc的編譯過(guò)程 一般情況下,c程序的編譯過(guò)程為1、預(yù)處理2、編譯成匯編代碼3、匯編成目標(biāo)代碼4、鏈接1、預(yù)處理 預(yù)處理:使用-E參數(shù)輸出文件的后綴為“.cpp”gcc E o gcctest.cpp gcctest.c 使用wc命令比較預(yù)處理后的文件與源文件,可

3、以看到兩個(gè)文件的差異行數(shù) 單詞數(shù) 字節(jié)數(shù)預(yù)處理 預(yù)處理文件匯編代碼1)使用-x參數(shù)說(shuō)明根據(jù)指定的步驟進(jìn)行工作,cpp-output指明從預(yù)處理得到的文件開始編譯2)使用-S說(shuō)明生成匯編代碼后停止工作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匯編代

4、碼目標(biāo)代碼直接編譯成目標(biāo)代碼使用匯編器testsse.o UltraEdit Objdump4、編譯成執(zhí)行代碼 目標(biāo)代碼執(zhí)行代碼gcc o gcctest gcctest.o 直接生成執(zhí)行代碼gcc o gcctest gcctest.c目標(biāo)代碼執(zhí)行代碼直接生成執(zhí)行代碼testsse.o V.S. testsse復(fù)習(xí) 程序的編譯-執(zhí)行過(guò)程1、預(yù)處理2、編譯成匯編代碼3、匯編成目標(biāo)代碼4、鏈接深入理解計(jì)算機(jī)系統(tǒng)深入理解計(jì)算機(jī)系統(tǒng)- -第一章第一章 計(jì)算機(jī)系統(tǒng)漫游計(jì)算機(jī)系統(tǒng)漫游gcc的高級(jí)選項(xiàng) -Wall:打開所有的警告信息根據(jù)警告信息檢查源程序Main函數(shù)的返回值為int在函數(shù)的末尾應(yīng)當(dāng)返回一個(gè)

5、值修改源程序優(yōu)化編譯 優(yōu)化編譯選項(xiàng)有: -O0缺省情況,不優(yōu)化 -O1 -O2 -O3 等等不同程度的優(yōu)化gcc的優(yōu)化編譯舉例(1)考慮如下的源代碼不同的優(yōu)化編譯選項(xiàng)gcc的優(yōu)化編譯舉例(2)使用time命令統(tǒng)計(jì)程序的運(yùn)行GNU tools GNU tools和其他一些優(yōu)秀的開源軟件可以完全覆蓋上述類型的軟件開發(fā)工具。為了更好的開發(fā)嵌入式系統(tǒng),需要熟悉如下一些軟件 GCC Binutils輔助GCC的主要軟件 Gdb make cvs二、GNU binutils binutils是一組二進(jìn)制工具程序集,是輔助GCC的主要軟件,它主要包括 addr2line 把程序地址轉(zhuǎn)換為文件名和行號(hào)。在命令

6、行中給它一個(gè)地址和一個(gè)可執(zhí)行文件名,它就會(huì)使用這個(gè)可執(zhí)行文件的調(diào)試信息指出在給出的地址上是哪個(gè)文件以及行號(hào)。1.ar 建立、修改、提取歸檔文件。歸檔文件是包含多個(gè)文件內(nèi)容的一個(gè)大文件,其結(jié)構(gòu)保證了可以恢復(fù)原始文件內(nèi)容。as 是GNU匯編器,主要用來(lái)編譯GNU C編譯器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)引用,最終形成一

7、個(gè)可執(zhí)行文件。通常,建立一個(gè)新編譯程序的最后一步就是調(diào)用ld。nm 列出目標(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í)行文件的信息。size 列出目標(biāo)文件每一段的大小以及總體的大小。默認(rèn)情況下,對(duì)于每個(gè)目標(biāo)文件或者一個(gè)歸檔文件中的每個(gè)模塊只產(chǎn)生一行輸出。strings 打印某個(gè)文件的可打印

8、字符串打印字符串,這些字符串最少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)。 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、文本格式可讀的處理器操作指令.三、其他GNU工具 Gdb調(diào)試器 GNU make軟件工程工具 diff,patch補(bǔ)丁工具 CVS版本控制系統(tǒng)參考參考 Linux操作系統(tǒng)分析操作系統(tǒng)分析課程中的課程中的 GNU ToolsMakefileEmbedded System Lab Spring 2017Makefile依賴關(guān)系依賴關(guān)系一個(gè)“復(fù)雜”的例子Makefile定義定義多個(gè)文件多個(gè)文件在在GCCGCC參數(shù)較多(靈活)時(shí)、文件較多時(shí)極為有效參數(shù)較多(靈活)時(shí)、文件較多時(shí)極為有效手動(dòng)優(yōu)化策略 考慮如下源代碼iajia如何計(jì)算哪個(gè)更好? 一層循環(huán)時(shí),共100W條指令 50W addl +25W c

10、mp + 25W JLE 二層循環(huán)時(shí) 內(nèi)層循環(huán)共100W條指令50W addl +25W cmp + 25W JLE 外層循環(huán)共 2500 條指令500addl+500cmp+500JLE+500movl+500JMP 與指令CPI有關(guān)CLKCPUTICCPITAcknowledgements These slides contain material developed and copyright by: Prof. Zhiying Wang (NUDT) Dr. Xianglan Chen(USTC) Prof. Xuehai Zhou (USTC) Prof. Krste Asanovic (MIT

溫馨提示

  • 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)論