一 arm-linux-gcc 常用參數
https://www.cnblogs.com/zhangpengshou/p/3587751.html
二 arm-linux-objdump常用參數
https://blog.csdn.net/freeplayer/article/details/45133721
三 arm-linux-objcopy常用參數
https://blog.csdn.net/tang_jin_chan/article/details/8675269
四 GCC
1 GCC編譯流程:
1. 預處理(Pre-Processing)
2. 編譯(Compiling)
3. 匯編(Assembling)
4. 鏈接(Linking)
2 GCC所支持的后綴名解釋
后綴名 | 所對應的語言 | 編譯流程 |
.c | C源程序 | 預處理、編譯、匯編 |
.C/.cc/.cxx | C++源程序 | 預處理、編譯、匯編 |
.m | Objective-C源程序 | 預處理、編譯、匯編 |
.i | 已經預處理的c源程序 | 編譯、匯編 |
.ii | 已經預處理的c++源程序 | 編譯、匯編 |
.s/.S | 匯編語言源程序 | 匯編 |
.h | 預處理文件(頭文件) | 預處理 |
.o | 目標文件 | 鏈接 |
.a/.so | 靜態/動態庫文件 | 鏈接 |
3 GCC編譯流程分析
3.1 預處理階段
命令格式: |
gcc -E -o [目標文件] [編譯文件] |
注: -E 使編譯器在預處理結束時就停止編譯 -o 指定GCC輸出的結果 |
gcc -E -o hello.i hello.c
//".h"文件是不能進行編譯的,所以需要生成".i"文件;<.i文件是經過預處理的c源程序>
//預處理階段結果:將"hello.h"的內容添加到"hello.i"文件中
/*如果在一個test的文件夾中*/ gcc -E -o test/hello.i test/hello.c
3.2 編譯階段
編譯器在預處理結束后進行編譯。GCC首先要檢測代碼的規范性,是否有語法錯誤等,以確定代碼實際要做的工作。檢查無誤后就開始把代碼翻譯成匯編語言,GCC的選項‘-S’能使編譯器進行完編譯后就停止。
gcc -S -o hello.s hello.i
//".s"代表匯編語言源程序,
//編譯結果:將"hello.i"代碼翻譯成"hello.s"的匯編代碼
/*如果在一個test的文件夾中*/ gcc -S -o test/test.s test/test.i
3.3 匯編階段
把編譯階段生成的".s"文件生成為目標文件
gcc -c hello.s -o hello.o
//使用"-c"可以看到由匯編代碼轉換為".o"的二進制代碼
/*如果在一個test的文件夾中*/ gcc -c test/hello.s -o test/hello.o
3.4 鏈接階段
編譯成功后進入鏈接階段,進入鏈接后生成可執行的文件
gcc hello.o -o hello
運行執行文件,輸出結果
./hello
/*如果在一個test的文件夾中*/ gcc test/hello.o -o test/hello //hello為執行文件 ./test/hello //執行執行文件
4 直接生成一個執行文件
gcc test/hello.c -o test/hello
四 make
1 makefile術語
規則:用於說明如何生成一個或多個目標文件
規則格式如下:(-c只產生一個.o的目標文件)
targets :prerequisite
command
目標 依賴 命令
main.o : main.c
gcc -c main.c [命令需要以【Tab】鍵開始]
解釋:目標就是生成一個main.o,依賴於main.c文件,命令就是gcc -c main.c
hello:main.o func1.o func2.o //hello為最終目標的可執行文件 gcc main.o func1.o func2.o -o hello main.o:main.c gcc -c main.c func1.o : func1.c gcc -c func1.c func2.o : func2.c gcc -c func2.c .PHONY :clean clean: rm -f hello main.o func1.o func2.o
2 目標
Makefile中,規則的順序是很重要的,因為Makefile中只應該有一個最終目標,其它的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什么。一般來說,定義在Makefile中的目標可能會有很多,但是第一條規則中的目標將被確立為最終的目標。
3 文件名
make命令默認在當前目錄下尋址名字為Makefile或makefile的工程文件,當名字不為這兩者之一時,可以使用如下方法指定。
make -f 文件名
4 示例
4.1 在test文件夾中創建makefile文件
dongry@d-linux:~$ vim test/makefile //在test文件夾中創建一個makefile文件
4.2 編寫makefile文件(haha.o為需編譯生成的目標文件,名字隨便起)
haha.o : test/test1.c gcc -c test/test1.c -o test/haha.o //開頭【tab】鍵
4.3 進入目標文件夾進行make
4.3.1 進入目標文件夾
dongry@d-linux:~$ cd test
4.3.2 make
dongry@d-linux:~/test$ make gcc -c test1.c -o haha.o //表示成功生成haha.o目標文件
4.3.3 退出當前目錄
dongry@d-linux:~/test$ cd ~
dongry@d-linux:~$
5 偽目標
makefile把那些沒有任何依賴只有執行動作的目標稱為"偽目標"。(phony targets)
.PHONY clean [".PHONY"將"clean"聲明為偽目標]
clean :
【Tab】 rm -f main.o func1.o func2.o
6 變量
hello : main.o func1.o func2.o
gcc -c main.o func1.o func2.o -o hello
給hello目標添加一個依賴,如func3.o,如何實現。
方法一:
hello : main.o func1.o func2.o func3.o
gcc -c main.o func1.o func2.o func3.o -o hello
方法二:
obj=main.o func1.o func2.o func3.o
hello : $(obj)
gcc -c $(obj) -o hello
6.1 在makefile系統中存在系統默認的自動化變量
$^:代表所有的依賴文件
$@:代表目標
$<:代表第一個依賴文件
eg:
hello : main.o func1.o func2.o
gcc -c main.o func1.o func2.o -o hello
同:hello :main.o func1.o func2.o
gcc $^ -o $@
7 常用項
makefile中"#"后面的被認為是注釋
hello : hello.c @gcc hello.c -o hello "@"取消回顯 //表示輸入make命令后,不出現下面的一行:
gcc -c test1.c -o haha.o //不會出現