1. 程式人生 > >arm-linux-系列工具,ld,ar,as,objcopy

arm-linux-系列工具,ld,ar,as,objcopy

一、編譯器相關知識學習

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將組合語言程式轉換為ELF (Executable and Linking Format,執行時連結檔案格式)格式的可重定位目的碼,這些目的碼同其它目標模組或函式庫易於定位和連結。
      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

       arm-elf-ar將多個可重定位的目標模組歸檔為一個函式庫檔案。採用函式庫檔案,應用程式能夠從該檔案中自動裝載要參考的函式模組,同時將應用程式中頻繁呼叫的函式放入函式庫檔案中,易於應用程式的開發管理。arm-elf-ar支援ELF格式的函式庫檔案.

5. 工程管理器MAKE

       Make是用於自動編譯、連結程式的實用工具,使用make後就不需要手工的編譯每個程式檔案。要使用make,首先要編寫makefile。
       Makefile描述程式檔案之間的依賴關係,並提供更新檔案的命令。在一個程式中,可執行檔案依賴於目標檔案,而目標檔案依賴於原始檔。如果makefile檔案存在,每次修改完源程式後,使用者通常所需要做的事情就是在命令列敲入“make”,然後所有的事情都由make來完成。

6. 其他實用程式

       目標檔案格式轉換工具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",有效的標頭檔案搜尋目錄

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 不從原始檔中複製除錯符號到目標檔案中