- 編譯過程的理解
- 預處理:針對預處理命令,例如#include,#define,#ifdef…#ednif。將相應的預處理命令執行,例如#include的包含,#define的替換等,將.c/.cpp文件轉化爲.i文件,生成的.i文件會比.c/.cpp文件大的多,主要是因爲包含進大量的.h文件。
- 編譯:預處理之後的.i文件將用來做具體的編譯,將.i文件轉化爲彙編.s文件。對於.s文件,我們可以通過彙編的語法瞭解程序內部的具體流程。特別的,由於.s文件相對於.i文件拋棄了大量的無用內容,所以.s文件會比.i文件小的多。同時。由於彙編語言相對於c/c++較爲繁瑣,所以.s文件會比.c/.cpp大一些。
- 彙編:上一步生成的.s文件將會用來彙編成機器代碼.o文件,同時也是可執行文件。自然,機器代碼要比彙編語言更繁瑣一些,相應的.o文件會比.s文件大一些。
- 連接:在寫程序的時候不可避免的會用到一些庫文件,或是本身的源文件就由多個源文件組成,也就是說,彙編的過程將程序的各個有機部分編譯成功,最後一步自然要將各個部分的.o文件結合庫文件連接到一起,生成最終的可執行.o文件。
- gcc/cc/arm-linux-gcc的常用選項
- -c: 編譯不連接, .c/.cpp->.o
- -S: 不彙編, .c/.cpp->.s
- -E: 不編譯, .c/.cpp->.i
- -o file: 生成名爲file的文件
- -v: 顯示配置命令
- -Wall: 查看所有警告,特別是直接編譯不會顯示的一些警告
- -g: 調試專用
- -O: 優化
- -llibrary: 連接名爲liblibrary.a的庫
- -shared: 生成一個庫文件
- -Ldir: 假如鏈接的搜索路徑
- -Idir: 假如頭文件搜索目錄
- -nostartfile: 不連接標準啓動文件
- -nostdlib: 不連接標準啓動文件和標準庫文件
- ld/arm-linux-ld常用選項
- -T:指定程序或數據區的存放地址,例如-Ttext/-Tdata/-Tbss addr(16進製表示)
- -T filename: 指定連接腳本
- objdump/arm-linux-objdump常用選項
格式: arm-linux-objdump -D main.o > main.s
- -d: 反彙編可執行段
- -D: 反彙編所有段
gcc/arm-linux-gcc 淺析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.