gnu gcc簡介:
gnu gcc是一套面向嵌入式領域的交叉編譯工具,支援多種程式語言、多種優化選項並且能夠支援分步編譯、支援多種反彙編方式、支援多種除錯資訊格式,目前支援x86、arm7、strongarm、ppc4xx、mpc8xx、mips r3000等多種cpu。
gnu gcc的基本功能包括:輸出預處理後的c/c++源程式(展開標頭檔案和替換巨集)
輸出c/c++源程式的彙編**
輸出二進位制目標檔案
生成靜態庫
生成可執行程式
轉換檔案格式
gcc 組成:
c/c++交叉編譯器arm-elf-gcc
arm-elf-gcc是編譯的前端程式,它通過呼叫其他程式來實現將程式原始檔編譯成目標檔案的功能。
編譯時,它首先呼叫預處理程式(cpp)對輸入的源程式進行處理,然後呼叫 cc1 將預處理後的程式編譯成彙編**,最後由arm-elf-as將彙編**編譯成目標**。
arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足使用者的各種編譯需求。
彙編器 arm-elf-as
arm-elf-as將組合語言程式轉換為elf (executable and linking format,執行時鏈結檔案格式)格式的可重定位目標**,這些目標**同其它目標模組或函式庫易於定位和鏈結。
arm-elf-as產生乙個交叉參考表和乙個標準的符號表,產生的**和資料能夠放在多個區 (section)中。
聯結器arm-elf-ld
arm-elf-ld根據鏈結定位檔案linkcmds中的**區、資料區、bss區和棧區等定位資訊,將可重定位的目標模組鏈結成乙個單一的、絕對定位的目標程式。
該目標程式是elf格式,並且可以包含除錯資訊。
arm-elf-ld會產生乙個記憶體映象檔案map.txt,該檔案顯示所有目標模組、區和符號的絕對定位位址。它也產生交叉參考列表,顯示參考每個全域性符號的目標模組。
arm-elf-ld支援將多個目標模組鏈結成乙個單一的、絕對定位的目標程式,也能夠依此對目標模組進行鏈結,這個特性稱為增量鏈結(incremental linking)。
假如輸入檔案是乙個函式庫,arm-elf-ld會自動從函式庫裝載被其它目標模組參考的函式模組。arm-elf-ld與其它鏈結程式相比,能提供更有幫助的診斷資訊。許多鏈結器遇到第乙個錯誤即放棄鏈結,而arm-elf-ld只要有可能都繼續執行,幫助使用者識別其它錯誤,有時甚至能獲得輸出**。
庫管理器arm-elf-ar
arm-elf-ar將多個可重定位的目標模組歸檔為乙個函式庫檔案。採用函式庫檔案,應用程式能夠從該檔案中自動裝載要參考的函式模組,同時將應用程式中頻繁呼叫的函式放入函式庫檔案中,易於應用程式的開發管理。arm-elf-ar支援elf格式的函式庫檔案.
工程管理器make
make是用於自動編譯、鏈結程式的實用工具,使用make後就不需要手工的編譯每個程式檔案。要使用make,首先要編寫makefile。
makefile描述程式檔案之間的依賴關係,並提供更新檔案的命令。在乙個程式中,可執行檔案依賴於目標檔案,而目標檔案依賴於原始檔。如果makefile檔案存在,每次修改完源程式後,使用者通常所需要做的事情就是在命令列敲入「make」,然後所有的事情都由make來完成。
其他實用程式
目標檔案格式轉換工具arm-elf-objcopy支援的檔案格式有h-record、s-record、abs、bin、coff、elf。例如,它能夠將elf格式檔案轉換為其它格式的檔案,如intel h-record格式、motorola s-record等。arm-elf-nm程式用於顯示檔案中的符號資訊。
gcc編譯程式的基本過程:
arm-elf-gcc根據輸入檔案的字尾來確定檔案的型別,然後根據使用者的編譯選項(包括優化選項、除錯資訊選項等)將其編譯成相應的彙編臨時檔案(字尾為.s);
arm-elf-as將該彙編檔案編譯成目標檔案(字尾為.o);
arm-elf-ld 根據使用者的鏈結選項(包括指定鏈結命令檔案等)將目標檔案和各種庫鏈結起來生成可執行檔案。
c/c++交叉編譯器arm-elf-gcc
arm-elf-gcc是編譯的前端程式,它通過呼叫其他程式來實現將程式原始檔編譯成目標檔案。
編譯時它首先呼叫預處理程式(cpp)對輸入的源程式進行處理;然後呼叫cc1將預處理後的程式編譯成彙編**;最後由arm-elf-as將彙編**編譯成目標**。
1.命令格式
arm-elf-gcc [options] file…
在命令arm-elf-gcc後面跟乙個或多個選項,選項間用空格隔開,然後跟乙個或多個目標檔案。
例如,將test.c 編譯成目標檔案test.o 並且生成除錯資訊:
arm-elf-gcc –g –c –o test.o test.c
2.命令選項列表
輸出控制選項:
-c 將輸入的原始檔編譯成目標檔案
-s 將c/c++檔案生成彙編檔案
-o file 將輸出內容存於檔案file
-pipe 在編譯的不同階段之間採用管道通訊方式
-v 列印出編譯過程中執行的命令
-x language 說明檔案的輸入型別為language
c語言選項:
-ansi 支援所有ansi c程式
警告選項:
-w 關閉所有警告
-wall 開啟所有警告
-wimplicit 如果有隱含申明,顯示警告資訊
-wno-implicit 不顯示對隱含申明的警告
除錯選項:
-g 在檔案中產生除錯資訊(除錯資訊的檔案格式有stabs、coff、xcoff、dwarf)
優化選項:
-o0 不優化
-o1 一級優化
-o2 二級優化
-o3 **優化
預處理選項:
-e 執行c的預處理器
-c 在運用-e進行預處理時不去掉注釋
-d macro 定義巨集macro為1
-d macro=defn 定義巨集macro為defn
彙編選項:
-wa,option 將選項option傳遞 給彙編器
搜尋路徑選項:
-i dir 設定搜尋路徑為dir
-i- 指定只對 #include 「file」,有效的標頭檔案搜尋目錄
原始檔型別的識別
arm-elf-gcc能夠自動根據檔名字尾識別檔案型別.
檔名字尾和檔案型別的對應關係如下:
*.c ——c原始檔
*.i ——經過預處理後的c原始檔
*.h ——c標頭檔案
*.ii ——經過預處理後的c++原始檔
*.cc ——c++原始檔
*.cxx ——c++原始檔
*.cpp ——c++原始檔
*.c ——c++原始檔
*.s ——不需要預處理的彙編檔案
*.s ——需要預處理的彙編檔案
此外,使用者可通過-x language說明檔案的輸入型別,此時可以不用以上的字尾規則。
-x language
其中的language可為:
c ——c原始檔
c++ ——c++原始檔
c-header ——c標頭檔案
cpp-output ——經過預處理後的c原始檔
c++-cpp-output ——經過預處理後的c++原始檔
assembler ——不需要預處理的彙編檔案
assembler-with-cpp ——需要預處理的彙編檔案
例如,編譯乙個不需要預處理的c程式:
arm-elf-gcc –c –g –x cpp-output test.c
arm-linux-objcopy
一. arm-linux-objcopy被用來複製乙個目標檔案的內容到另乙個檔案中,可用於不同原始檔的之間的格式轉換
二. 示例:
arm-linux-objcopy –o binary –s elf_file bin_file
三. 常用的選項:
input-file , outflie
輸入和輸出檔案,如果沒有outfile,則輸出檔名為輸入檔名
2.-l bfdname或—input-target=bfdname
用來指明原始檔的格式,bfdname是bfd庫中描述的標準格式名,如果沒指明,則arm-linux-objcopy自己分析
3.-o bfdname 輸出的格式
4.-f bfdname 同時指明原始檔,目的檔案的格式
5.-r sectionname 從輸出檔案中刪除掉所有名為sectionname的段
6.-s 不從原始檔中複製重定位資訊和符號資訊到目標檔案中
7.-g 不從原始檔中複製除錯符號到目標檔案中
arm linux下編譯perf工具
因查詢linux系統下 kworker占用過高的原因,用perf工具來分析。perf為 linux kernel自帶的效能檢測工具。在linux3.10核心下編譯perf工具。1.cd 到 kerne tools perf路徑下 2.export path home huanghm work dsp...
Linux監控工具介紹系列 free
free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。free 選項 b 以byte為單位顯示記憶體使用情況 k 以kb為單位顯示記憶體使用情況 m 以mb為單位顯示記憶體使用情況 o 不顯示緩衝區調節列 s 間隔秒數 持續觀察記憶體使用狀況 t 顯示記憶體總...
littlefs系列 介紹
1 littlefs主要用在微控制器和flash上,是一種嵌入式檔案系統。主要有3個特點 1 掉電恢復 在寫入時即使復位或者掉電也可以恢復到上乙個正確的狀態。2 擦寫均衡 有效延長flash的使用壽命 3 有限的ram rom 節省rom和ram空間 2 已有的檔案系統 1 非掉電恢復,基於bloc...