arm-linux-系列工具,ld,ar,as,objcopy
阿新 • • 發佈:2019-02-02
一、編譯器相關知識學習
GNU GCC的基本功能包括:輸出預處理後的C/C++源程式(展開標頭檔案和替換巨集)
輸出C/C++源程式的彙編程式碼
輸出二進位制目標檔案
生成靜態庫
生成可執行程式
轉換檔案格式
編譯時,它首先呼叫預處理程式(cpp)對輸入的源程式進行處理,然後呼叫 cc1 將預處理後的程式編譯成彙編程式碼,最後由arm-elf-as將彙編程式碼編譯成目的碼。
arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足使用者的各種編譯需求。
arm-elf-as產生一個交叉參考表和一個標準的符號表,產生的程式碼和資料能夠放在多個區 (Section)中。
該目標程式是ELF格式,並且可以包含除錯資訊。
arm-elf-ld會產生一個記憶體映象檔案Map.txt,該檔案顯示所有目標模組、區和符號的絕對定位地址。它也產生交叉參考列表,顯示參考每個全域性符號的目標模組。
arm-elf-ld支援將多個目標模組連結成一個單一的、絕對定位的目標程式,也能夠依此對目標模組進行連結,這個特性稱為增量連結(Incremental Linking)。
假如輸入檔案是一個函式庫,arm-elf-ld會自動從函式庫裝載被其它目標模組參考的函式模組。arm-elf-ld與其它連結程式相比,能提供更有幫助的診斷資訊。許多連結器遇到第一個錯誤即放棄連結,而arm-elf-ld只要有可能都繼續執行,幫助使用者識別其它錯誤,有時甚至能獲得輸出程式碼。
Makefile描述程式檔案之間的依賴關係,並提供更新檔案的命令。在一個程式中,可執行檔案依賴於目標檔案,而目標檔案依賴於原始檔。如果makefile檔案存在,每次修改完源程式後,使用者通常所需要做的事情就是在命令列敲入“make”,然後所有的事情都由make來完成。
arm-elf-as將該彙編檔案編譯成目標檔案(字尾為.o);
arm-elf-ld 根據使用者的連結選項(包括指定連結命令檔案等)將目標檔案和各種庫連結起來生成可執行檔案。
編譯時它首先呼叫預處理程式(cpp)對輸入的源程式進行處理;然後呼叫cc1將預處理後的程式編譯成彙編程式碼;最後由arm-elf-as將彙編程式碼編譯成目的碼。
在命令arm-elf-gcc後面跟一個或多個選項,選項間用空格隔開,然後跟一個或多個目標檔案。
例如,將test.c 編譯成目標檔案test.o 並且生成除錯資訊:
arm-elf-gcc –g –c –o test.o test.c
-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",有效的標頭檔案搜尋目錄
檔名字尾和檔案型別的對應關係如下:
*.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 不從原始檔中複製除錯符號到目標檔案中
GNU GCC簡介:
GNU GCC是一套面向嵌入式領域的交叉編譯工具,支援多種程式語言、多種優化選項並且能夠支援分步編譯、支援多種反彙編方式、支援多種除錯資訊格式,目前支援X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多種CPU。GNU GCC的基本功能包括:輸出預處理後的C/C++源程式(展開標頭檔案和替換巨集)
輸出C/C++源程式的彙編程式碼
輸出二進位制目標檔案
生成靜態庫
生成可執行程式
轉換檔案格式
GCC 組成:
1. C/C++交叉編譯器arm-elf-gcc
arm-elf-gcc是編譯的前端程式,它通過呼叫其他程式來實現將程式原始檔編譯成目標檔案的功能。編譯時,它首先呼叫預處理程式(cpp)對輸入的源程式進行處理,然後呼叫 cc1 將預處理後的程式編譯成彙編程式碼,最後由arm-elf-as將彙編程式碼編譯成目的碼。
arm-elf-gcc具有豐富的命令選項,可以控制編譯的各個階段,滿足使用者的各種編譯需求。
2. 彙編器 arm-elf-as
arm-elf-as產生一個交叉參考表和一個標準的符號表,產生的程式碼和資料能夠放在多個區 (Section)中。
3. 聯結器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只要有可能都繼續執行,幫助使用者識別其它錯誤,有時甚至能獲得輸出程式碼。
4. 庫管理器arm-elf-ar
5. 工程管理器MAKE
Make是用於自動編譯、連結程式的實用工具,使用make後就不需要手工的編譯每個程式檔案。要使用make,首先要編寫makefile。Makefile描述程式檔案之間的依賴關係,並提供更新檔案的命令。在一個程式中,可執行檔案依賴於目標檔案,而目標檔案依賴於原始檔。如果makefile檔案存在,每次修改完源程式後,使用者通常所需要做的事情就是在命令列敲入“make”,然後所有的事情都由make來完成。
6. 其他實用程式
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",有效的標頭檔案搜尋目錄
3. 原始檔型別的識別
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 不從原始檔中複製除錯符號到目標檔案中