GCC几个选项学习
http://www.lingcc.com/2011/06/27/11679/
最近研究了一把GCC的選項,比較有意思,選些出來,學(xué)習(xí)學(xué)習(xí)。編譯器作為程序員的重要工具,GCC作為編譯器中應(yīng)用最廣泛的,無不處處體現(xiàn)出貼心的設(shè)計和功能支持。
Table of Contents
- 1 -dumpmachine
- 2 -xc
- 3 -dM
- 4 -print-file-name=include
- 5 -isystem DIR
- 6 -nostdinc/-nostdinc++
- 7 -Wp/-Wa/-Wl
- 8 -EL/-EB
- 9 -DMACRO/-UMACRO
- 10 -G num
- 11 -msym32/-mnosym32
- 12 -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks
- 13 -mcheck-zero-division/-mno-check-zero-division
- 14 -mabicalls/-mno-abicalls
- 15 -mbranch-likely/-mno-branch-likely
- 16 -fstack-protector
- 17 -fstrict-overflow
- 18 -fconserve-stack
- 19 參考
1 -dumpmachine
給出當(dāng)前使用GCC的信息,在erlv的Debian AMD64上,結(jié)果如下。
關(guān)于GCC的這些字段是什么意思,請參考這篇博文:
2 -xc
其實,-xc和 “-x c”等同。
- x用于指定輸入的程序的語言,如果使用該選項,GCC就不再根據(jù)文件的后綴名判斷語言類型。?
3 -dM
不做實際的預(yù)處理,僅僅列出所有#define的宏,這些宏大部分與體系結(jié)構(gòu)和GNU相關(guān),或來自所包含的頭文件。
#程序輸出太長,這里就不列出了 $gcc -E -dM hello.c另外,還有一些-dCHARS的組合選項:
- -dD:和-dM類似,不過僅僅包含頭文件中定義的宏,不會輸出預(yù)處理器中默認(rèn)定義的宏,另外會將源程序代碼也預(yù)處理輸出。
- -dN:和-dD類似,但僅輸出定義的宏的名稱,不輸出宏的值。
- -dI:給出#include的頭文件,預(yù)計預(yù)處理的結(jié)果
- -dU:和-dD類似,但僅僅輸出那些在源碼中需要展開的,或者其定義會被測試到的宏。?
4 -print-file-name=include
打印GCC默認(rèn)搜索include頭文件的路徑
$ gcc -print-file-name=include /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/include5 -isystem DIR
將DIR路徑作為頭文件搜索路徑之一。搜索順序: -I指定的文件夾 =》 -isystem指定的文件夾 =》 標(biāo)準(zhǔn)系統(tǒng)頭文件夾。
6 -nostdinc/-nostdinc++
不要搜索標(biāo)準(zhǔn)系統(tǒng)頭文件目錄,僅搜索-I指定的路徑。
7 -Wp/-Wa/-Wl
這三個分別用來指定傳遞給 預(yù)處理起、匯編器和鏈接器的參數(shù)。
- -Wp,option 等價于 -Xpreprocessor option
- -Wa,option 等價于 -Xassembler option
- -Wl,option 等價于 -Xlinker option
8 -EL/-EB
為小尾端/大尾端系統(tǒng)編譯代碼。默認(rèn)是小尾端
9 -DMACRO/-UMACRO
定義宏MACRO/撤銷對宏MACRO的定義
10 -G num
將全局和靜態(tài)對象的大小分割成小于num字節(jié)的數(shù)據(jù)放入bss端的小數(shù)據(jù)中,而非正常數(shù)據(jù)中。
默認(rèn)的num的值為8.
由于MIPS在從符號得到地址時,需要先取出高16位,再取出低16位,做拼接得到最終地址,所以就需要兩次訪存操作。
當(dāng)程序中大量使用靜態(tài)和全局?jǐn)?shù)據(jù)時,這種方式就會讓程序變慢。
于是就有了利用GP寄存器進行優(yōu)化的方法,即采用和GP寄存器做相對偏移的方式訪存,以便降低訪存次數(shù)。
關(guān)鍵問題是編譯器和匯編器需要在編譯時刻確定哪些變量可以使用GP寄存器訪問。
通常的做法是讓大小小于一定值的變量通過GP寄存器訪問。
若num為 0表示將這一優(yōu)化關(guān)閉。
11 -msym32/-mnosym32
不管采取何種ABI,都假設(shè)/不假設(shè)所有符號都是32位的值。
這一選項配合-mabi=64 和-mno-abicall時非常有用,因為可以通過假設(shè)都是32位數(shù)據(jù)生成更小巧更快的符號地址
12 -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks
delete-null-pointer-checks是一種優(yōu)化手段,通過全局的數(shù)據(jù)流分析來識別和刪除所有對空指針的檢測操作。
編譯器假定對空指針的解引用會造成程序終止。但因為有些環(huán)境下,這一結(jié)論并不一定成立,而O2,O3和Os時會開啟此優(yōu)化。
因此GCC增加了選項-fno-delete-null-pointer-checks
13 -mcheck-zero-division/-mno-check-zero-division
當(dāng)整數(shù)除0操作時,陷入/不陷入
14 -mabicalls/-mno-abicalls
生成/不生成適SVR4形式的動態(tài)對象代碼,默認(rèn)生成。
15 -mbranch-likely/-mno-branch-likely
使用/使用 branch likely 指令,不管所指定體系結(jié)構(gòu)默認(rèn)是否支持。
GCC默認(rèn)會為支持branch likely指令的體系結(jié)構(gòu)生成branch likely指令。
引入這類指令,是為了引入一種很大可能會發(fā)生跳轉(zhuǎn)的指令,這樣編譯器就能充分的利用MIPS中的delay slot。
16 -fstack-protector
為可能的緩沖區(qū)溢出生成額外的檢測代碼。
17 -fstrict-overflow
允許編譯器使用嚴(yán)格的有符號溢出規(guī)則。
18 -fconserve-stack
盡量減小對棧的使用。
19 參考
- http://gcc.gnu.org/ml/gcc-help/2006-10/msg00191.html
- See MIPS Run Linux, 2ed, by Dominic Sweetman, Page 273
- GCC man pages?
轉(zhuǎn)載于:https://www.cnblogs.com/cnland/archive/2013/02/08/2909248.html
總結(jié)
- 上一篇: python2.x文件编码
- 下一篇: OpenSuSe使用相关