1 交叉編譯工具
一個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.2 arm-linux-gcc選項
1.2.1 總體選項
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,優化;
1.2.2 連接器選項
下面的選項用於連接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”選項生成庫文件;
1.2.3 目錄選項
1,I(大寫i)dir
在頭文件的搜索路徑列表中添加dir目錄
2,L(大寫l)dir
常接”-L”指定的庫文件搜索路徑
1.2.4 庫選項
參考4.1.1節
1.3 arm-linux-ld選項
arm-linux-ld 用於將多個目標文件,庫文件連接成可執行文件,
1.4 arm-linux-objcopy選項
用來複制一個目標文件的內容到另一個文件中;可以使用不同的源文件格式來輸出目的文件,及可以進行格式轉換;
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.5 arm-linux-objdump選項
用於顯示二進制文件信息,常用來查看反彙編代碼;
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