天天看點

GNU常用指令

GNU COMMAND

    • GNU COMMAND
      • gcc
      • ld

1. gcc

  GCC可以用來編譯C/C++、FORTRAN、JAVA、OBJC、ADA等語言的程式,功能強大。可以對源代碼進行預處理、編譯、彙編、連結等操作,最終生成我們需要的可執行檔案。

template:
*gcc [option] [parameter]*

[option]
* null 當option不添加如下幾個選項(-E  -C -S -o),則直接編譯生成可執行檔案
* -E 編譯預處理,主要将代碼中的"#"相關的代碼替換掉,比如:#define  #ifdef    #elif   #endif等,添加行号
* -C 編譯不連結,将預處理之後的檔案進行代碼優化、語義分析轉換為彙編代碼等
* -S 彙編,将編譯之後的彙編代碼轉換為機器指令
* -o 指定生成的檔案名,預設為a.out
* -On 優化選項,n可以取0,1,2,3,O0關閉所有優化選項,n越大優化強度越大,預設為O2
* -I 指定頭檔案路徑
* -L 指定連結庫時查找路徑,多個庫路徑之間用冒号隔開
* -g 在編譯結果中加入調試資訊
* -Wall 打開gcc所有編譯警告 warning all
* -Werror Make all warnings into errors,即将所有warning當error處理
* -w Inhibit all warning messages,關閉所有的warning警告
* -verbose 将整個編譯連結過程的中間步驟列印出來
* -fno-common 把所有未初始化的全局變量不以COMMON塊的形式處理,就相當于以強符号處理
* -fomit frame pointer 取消幀指針(Frame Pointer) ebp,通過esp直接計算幀上變量的位置。會導緻幀上尋址速度變慢,無法定位函數的調用軌迹(Stack Trace)。
* -ffunction-sections 将每個函數編譯到獨立的代碼段,一般段名為".text.[functionName]"
* -fdata-sections 将全局/靜态變量編譯到獨立的資料段,一般段名為".data.[dataName]"
* -fno-builtin 關閉内置函數優化選項,比如GCC會将隻用了一個字元串參數的"printf"替換成"puts"函數以提高運作速度,使用"-fno-builtin"可以關閉這個内值函數優化選項。
* -m32 強制使用32bit的ABI進行編譯

[parameter]
* 源代碼檔案
           

2. ld

  ld指令是GNU的連結器,将目标檔案連結為可執行程式,現在的連結器一般采用兩步連結的方法:空間與位址配置設定、符号解析與重定位。重定位是整個連結過程的核心。

template:
*ld  [option] [parameter]*

[option]
* -e 設定程式入口,ld連結器的預設程式入口為_start
* -o 指定連結輸出檔案名,預設為a.out
* -l  指定連結某個庫
* -static  靜态連結
* -verbose 連結時輸出詳細資訊
* -m elf_i386 指定連結時用的連結控制腳本,預設ld連結腳本存放于/usr/lib/ldscripts/下
* -T 自己寫一個連結控制腳本,指定該腳本為控制腳本

[parameter]
* 目标檔案:需要被連結的目标檔案
           

繼續閱讀