1. 程式人生 > >工程中編寫自己的makefile---3 交叉編譯工具

工程中編寫自己的makefile---3 交叉編譯工具

一個C/C++檔案要經過預處理(preprocessing),編譯(compilation),彙編(assembly),連線(linking);

1.1             概述

1,預處理

         .c  >> .i

         將要包含(include)的檔案插入原始檔中,將巨集定義展開,根據條件編譯命令選擇要使用的程式碼,最後將這些程式碼輸出到一個”.i”檔案中等待進一步處理;一般用到arm-linux-cpp

2,編譯

         .i  >> .s

         把C/C++的程式碼(比如上面的”.i”檔案)”翻譯”成彙編程式碼,所用到的工具是 ccl

3,彙編

         .s  >> .o

         將上一步中的彙編程式碼翻譯成符合一定格式的機器可識別但不能執行的機器程式碼,在linux系統上一般表現為 .o 字尾的目標檔案(OBJ檔案),用到的工具是arm-linux-as ; ”反彙編”是指將機器程式碼裝換為彙編程式碼,在除錯程式時常用到;

4,連線

.o  >>  elf

         將多個 .o 檔案和系統庫檔案連結成為可在特定平臺執行的可執行檔案,(linux下為ELF格式),用到的工具為 arm-linux-ld

1-o  file

指定輸出的檔案為file; 但只能指定一個輸出檔案;

2-c

         輸出 .o 檔案

編譯或彙編原始檔,但不做連線,編譯器輸出對應於原始檔的目標檔案,預設情況下,GCC通過使用”.o”替代原始檔名的字尾”.c”,”.i”,”.s”等,產生OBJ檔名; 可以使用”-o”選項選擇其他的名字;

gcc 忽略 –c 選項後面任何無法識別的輸入檔案(不編譯或彙編)

3,-S

         輸出 .s 檔案

編譯後即停止,不進行彙編,對於每個輸入的非組合語言檔案,輸出結果是組合語言檔案; 預設情況下,GCC通過使用”.s”替代原始檔名的字尾”.c”,”.i”,等,產生彙編檔名; 可以使用”-o”選項選擇其他的名字;

4,-E

輸出 .i 檔案

         預處理後即停止,不進行編譯,預處理後的程式碼送往標準輸出;

5,-v

         顯示製作GCC工具自身時的配置命令,同時顯示編譯器驅動程式,前處理器,編譯器的版本號;

6,-pipe

在編譯過程的不同階段間使用管道而非臨時檔案進行通訊

7,-x        language

明確指出後面輸入檔案的語言為 language (而不是從檔案字尾得到預設選擇)

警告選項

8-Wall

         基本打開了所有需要注意的警告資訊;

9,除錯選項

         -g

         以作業系統的本地格式(stabs,COFF, XCOFF,或DWARF).產生除錯資訊. GDB能夠使用這些除錯資訊.

10,優化選項

         -O,-O0,-O1,-O2,-O4,優化;

         下面的選項用於連線OBJ檔案,輸出可執行檔案或庫檔案;

1,object-file-name

         gcc  -o test  main.o  sub.o    其中: main.o  sub.o就是輸入的檔案

2-l(小寫l)library

    連線名為library的庫檔案,常接”-L”指定的庫搜尋路徑; 指定期望連線的庫的名字,注意!!!檔案的順序就是連結的順序

3,-nostartfiles

         不連線系統標準啟動檔案,而標準庫檔案仍然正常使用,在編譯bootloader,核心時將用到這個選項;

4,-nostdlib

         不連線系統標準啟動檔案和標準庫檔案,只把指定的檔案傳遞給聯結器,在編譯bootloader,核心時將用到這個選項;

5-static

         連線靜態庫是使用該選項

6-shared

         生成一個共享OBJ檔案,他可以和其他OBJ檔案連線產生可執行檔案,當不想以原始碼釋出程式時,使用”-shared”選項生成庫檔案;

1I(大寫i)dir

         在標頭檔案的搜尋路徑列表中新增dir目錄

2L(大寫l)dir

常接”-L”指定的庫檔案搜尋路徑

參考4.1.1節

arm-linux-ld 用於將多個目標檔案,庫檔案連線成可執行檔案,

        用來複制一個目標檔案的內容到另一個檔案中;可以使用不同的原始檔格式來輸出目的檔案,及可以進行格式轉換;

1,Input-file  outfile

         分別表示輸入目標檔案(源目標檔案)和輸出目標檔案(目的目標檔案);如果沒有明確指出輸出目標檔案,則將輸出目標檔案覆蓋到輸入目標檔案;

2,-I bfdname或--input-target=bfdname

         用來指明原始檔格式;

3,-O bfdname或--output-target=bfdname

用來指明目標檔案格式;

4,-F bfdname--target=bfdname

         指明原始檔格式目標檔案格式,只進行復制不轉換;

5,-S 或 --strip-all

         不從原始檔中複製重定位資訊和符號資訊到目標檔案中去

6,-g 或--strip-debug

         不從原始檔中複製除錯符號到目標檔案中去

用於顯示二進位制檔案資訊,常用來檢視反彙編程式碼;

1,-b  bfdname

         指定目標碼格式,

2,-d

         反彙編可執行段

3,-D

         反彙編所有段

4,-f

         顯示檔案的整體頭部摘要資訊;

5,-h

         顯示檔案的各個段頭部摘要資訊;

6,-i

         顯示支援的目標檔案格式和CPU架構,他們在“-b”“-m”選項中用到

7,-m machine

         指定反彙編目標檔案時使用的架構;

例如:

將ELF格式的檔案轉換為反彙編檔案

         arm-linux-objdump–D  elf_file > dis_file

將二進位制檔案轉換為反彙編檔案

         Arm-linux-objdump–D  –b binary  –m arm bin_file>dis_file