gcc/arm-linux-gcc 淺析

  1. 編譯過程的理解
    • 預處理:針對預處理命令,例如#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文件。
  2. 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: 不連接標準啓動文件和標準庫文件
  3. ld/arm-linux-ld常用選項
    • -T:指定程序或數據區的存放地址,例如-Ttext/-Tdata/-Tbss addr(16進製表示)
    • -T filename: 指定連接腳本
  4. objdump/arm-linux-objdump常用選項
    格式: arm-linux-objdump -D main.o > main.s
    • -d: 反彙編可執行段
    • -D: 反彙編所有段
發佈了19 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章