ch3-程序的執(zhí)行過程_2017227142222739_第1頁
ch3-程序的執(zhí)行過程_2017227142222739_第2頁
ch3-程序的執(zhí)行過程_2017227142222739_第3頁
ch3-程序的執(zhí)行過程_2017227142222739_第4頁
ch3-程序的執(zhí)行過程_2017227142222739_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Ch3 程序編譯的過程GCCEmbedded System Lab Spring 2017程序編譯的過程 GCC=一個C編譯器?其實GCC = GNU Compiler Collection 目前,GCC可以支持多種高級語言,如 C、C+ ADA Object C JAVA Fortran PASCALGCC下的工具 cpp 預處理器GNU C編譯器在編譯前自動使用cpp對用戶程序進行預處理 gcc 符合ISO等標準的C編譯器 g+ 基本符合ISO標準的C+編譯器 gcj GCC的java前端 gnat GCC的GNU ADA 95前端GNU Toolsgcc gcc是一個強大的工具集合,它包

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

3、以看到兩個文件的差異行數(shù) 單詞數(shù) 字節(jié)數(shù)預處理 預處理文件匯編代碼1)使用-x參數(shù)說明根據指定的步驟進行工作,cpp-output指明從預處理得到的文件開始編譯2)使用-S說明生成匯編代碼后停止工作gcc -x cpp-output -S -o gcctest.s gcctest.cpp 也可以直接編譯到匯編代碼gcc -S gcctest.c2、編譯成匯編代碼預處理文件匯編代碼3、編譯成目標代碼 匯編代碼目標代碼gcc x assembler c gcctest.s 直接編譯成目標代碼gcc c gcctest.c 使用匯編器生成目標代碼as o gcctest.o gcctest.s匯編代

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

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

6、行中給它一個地址和一個可執(zhí)行文件名,它就會使用這個可執(zhí)行文件的調試信息指出在給出的地址上是哪個文件以及行號。1.ar 建立、修改、提取歸檔文件。歸檔文件是包含多個文件內容的一個大文件,其結構保證了可以恢復原始文件內容。as 是GNU匯編器,主要用來編譯GNU C編譯器gcc輸出的匯編文件,他將匯編代碼轉換成二進制代碼,并存放到一個object文件中,該目標文件將由連接器ld連接C+filt解碼C+符號名,連接器使用它來過濾 C+ 和 Java 符號,防止重載函數(shù)沖突。 gprof 顯示程序調用段的各種數(shù)據。ld 是連接器,它把一些目標和歸檔文件結合在一起,重定位數(shù)據,并鏈接符號引用,最終形成一

7、個可執(zhí)行文件。通常,建立一個新編譯程序的最后一步就是調用ld。nm 列出目標文件中的符號。objcopy把一種目標文件中的內容復制到另一種類型的目標文件中.objdump 顯示一個或者更多目標文件的信息。使用選項來控制其顯示的信息。它所顯示的信息通常只有編寫編譯工具的人才感興趣。ranlib 產生歸檔文件索引,并將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。readelf 顯示elf格式可執(zhí)行文件的信息。size 列出目標文件每一段的大小以及總體的大小。默認情況下,對于每個目標文件或者一個歸檔文件中的每個模塊只產生一行輸出。strings 打印某個文件的可打印

8、字符串打印字符串,這些字符串最少4個字符長,也可以使用選項-n設置字符串的最小長度。默認情況下,它只打印目標文件初始化和可加載段中的可打印字符;對于其它類型的文件它打印整個文件的可打印字符,這個程序對于了解非文本文件的內容很有幫助。strip 丟棄丟棄目標文件中的全部或者特定符號。 libiberty 包含許多GNU程序都會用到的函數(shù),這些程序有: getopt, obstack, strerror, strtol 和 strtoul.libbfd 二進制文件描述庫.libopcodes 用來處理opcodes的庫, 在生成一些應用程序的時候也會用到它, 比如objdump. Opcodes是

9、文本格式可讀的處理器操作指令.三、其他GNU工具 Gdb調試器 GNU make軟件工程工具 diff,patch補丁工具 CVS版本控制系統(tǒng)參考參考 Linux操作系統(tǒng)分析操作系統(tǒng)分析課程中的課程中的 GNU ToolsMakefileEmbedded System Lab Spring 2017Makefile依賴關系依賴關系一個“復雜”的例子Makefile定義定義多個文件多個文件在在GCCGCC參數(shù)較多(靈活)時、文件較多時極為有效參數(shù)較多(靈活)時、文件較多時極為有效手動優(yōu)化策略 考慮如下源代碼iajia如何計算哪個更好? 一層循環(huán)時,共100W條指令 50W addl +25W c

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

評論

0/150

提交評論