歡迎您光臨本站 註冊首頁

gcc使用手冊(3)

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

-print-libgcc-file-name

和`-print-file-name=libgcc.a'一樣.

-print-prog-name=program

類似於`-print-file-name',但是查找程序program如`cpp'.



優化選項(OPTIMIZATION OPTION)

這些選項控制多種優化措施:

-O

-O1

優化.對於大函數,優化編譯佔用稍微多的時間和相當大的內存.

不使用`-O'選項時,編譯器的目標是減少編譯的開銷,使編譯結果能夠調試.語句是獨
立的:如果在 兩條語句之間用斷點中止程序,你可以對任何變數重新賦值,或者在函
數體內把程序計數器指到其他語句,以及從源程序中 精確地獲取你期待的結果.

不使用`-O'選項時,只有聲明了register的變數才分配使用寄存器.編譯結果比不用
`-O'選項的PCC要略遜一籌.

使用了`-O'選項,編譯器會試圖減少目標碼的大小和執行時間.

如果指定了`-O'選項, `-fthread-jumps'和`-fdefer-pop'選項將被 打開.在有del
ay slot的機器上, `-fdelayed-branch'選項將被打開.在即使沒有幀指針 (frame
pointer)也支持調試的機器上, `-fomit-frame-pointer'選項將被打開.某些機器上
還可能會打開其他選項.

-O2

多優化一些.除了涉及空間和速度交換的優化選項,執行幾乎所有的優化工作.例如不
進行循環展開(loop unrolling)和函數內嵌(inlining).和-O選項比較,這個選項既
增加了編譯時間,也提高了生成代碼的 運行效果.

-O3

優化的更多.除了打開-O2所做的一切,它還打開了-finline-functions選項.

-O0

不優化.

如果指定了多個-O選項,不管帶不帶數字,最後一個選項才是生效的選項.

諸如`-fflag'此類的選項描述一些機器無關的開關.大多數開關具有肯定和否定兩種
格式; `-ffoo'開關選項的否定格式應該是`-fno-foo'.下面的列表只展示了一種格
式---那個不是 默認選項的格式.你可以通過去掉或添加`no-'構造出另一種格式.


-ffloat-store

不要在寄存器中存放浮點變數.這樣可以防止某些機器上不希望的過高精度,如6800
0的浮點寄存器(來自 68881)保存的精度超過了double應該具有的精度.

對於大多數程序,過高精度只有好處.但是有些程序嚴格依賴於IEEE浮點數的定義.對
這樣的程序可以使用 `-ffloat-store'選項.

-fmemoize-lookups

-fsave-memoized

使用探索法(heuristic)進行更快的編譯(僅對C++).默認情況下不使用探索法.由於
探索法只對某些輸入文件 有效,其他程序的編譯速度會變得更慢.

第一次編譯器必須對成員函數(或對成員數據的引用)建立一個調用.它必須(1)判斷
出這個類是否實現了那個名字的 成員函數; (2)決定調用哪個成員函數(涉及到推測
需要做哪種類型轉換); (3)檢查成員函數對調用者是否可見.所有這些構成 更慢的
編譯.一般情形,第二次對成員函數(或對成員數據的引用)建立的調用,必須再次經過
相同長度的處理.這意味著象 這樣的代碼

cout << "This " << p << " has " << n << " legs.\n";

對整個三步驟要做六次遍歷.通過使用軟體緩存, ``命中''能夠顯著地減少這種代價
然而不幸的是,使用這種緩存 必須實現其他機制,帶來了它自己的開銷. `-fmemoi
ze-lookups'選項打開軟體緩存.

因為函數的正文環境不同,函數對成員和成員函數的訪問權(可見性)也可能不同, g
++可能需要刷新緩存. 使用`-fmemoize-lookups'選項,每編譯完一個函數就刷新緩
存.而`-fsave-memoized'選項 也啟用同樣的緩存,但是當編譯器發覺最後編譯的函
數的正文環境產生的訪問權和下一個待編譯的函數相同,編譯器就 保留緩存內容.這
對某個類定義許多成員函數時非常有用:除了某些其他類的友函數,每個成員函數擁
有和其他成員函數完全一樣 的訪問權,因而無需刷新緩存.

-fno-default-inline

默認為不要把成員函數內嵌,因為它們定義在類的作用域內(僅C++).

-fno-defer-pop

一旦函數返回,參數就立即彈出.對於那些調用函數后必須彈出參數的機器,編譯器一
般情況下讓幾次函數調用的參數 堆積在棧上,然後一次全部彈出.

-fforce-mem

做數學運算前把將要使用的內存操作數送入寄存器.通過把內存訪問轉換成潛在的公
共子表達式,它可能產生較好的目標碼. 如果它們不是公共子表達式,指令組合應該
消除各自的寄存器載荷.我樂意傾聽不同意見.

-fforce-addr

做數學運算前把將要使用的內存地址常數送入寄存器.它可能和`-fforce-mem'一樣
產生較好的 目標碼.我樂意傾聽不同意見.

-fomit-frame-pointer

對於不需要幀指針(frame pointer)的函數,不要在寄存器中保存幀指針.這樣能夠避
免保存,設置和恢復 幀指針的指令;同時對許多函數提供一個額外的寄存器. 但是在
大多數機器上將無法調試.

某些機器上,如Vax,這個選項無效,因為標準調用序列自動處理幀指針,通過假裝不存
在而不保存任何東西.機器描述宏 FRAME_POINTER_REQUIRED控制目標機是否支持這
個選項.

-finline-functions

把所有簡單的函數集成進調用者.編譯器探索式地決定哪些函數足夠簡單,值得這種
集成.

如果集成了所有給定函數的調用,而且函數聲明為static,那麼一般說來GCC有權不按
彙編代碼輸出函數.

-fcaller-saves

允許在寄存器里分配數值,但是這個方案通常受到各個函數調用的衝擊,因此GCC生成
額外的代碼,在函數調用的 前後保存和復原寄存器內容.僅當生成代碼看上去優於反
之結果時才實現這樣的分配.

某些機器上該選項默認為允許,通常這些機器沒有調用保護寄存器代替使用.

-fkeep-inline-functions

即使集成了某個函數的所有調用,而且該函數聲明為static,仍然輸出這個函數一個
獨立的,運行時可調用 的版本.

-fno-function-cse

不要把函數地址存入寄存器;讓調用固定函數的指令顯式給出函數地址.

這個選項產生效率較低的目標碼,但是如果不用這個選項,某些不尋常的hack,改變匯
編器的輸出,可能因優化而帶來 困惑.

-fno-peephole

禁止任何機器相關的peephole優化.

-ffast-math

這個選項出於速度優化,允許GCC違反某些ANSI或IEEE規則/規格.例如,它允許編譯器
假設sqrt 函數的參數是非負數.

這個選項不被任何`-O'選項打開,因為對於嚴格依靠IEEE或ANSI規則/規格實現的數
學函數,程序可能 會產生錯誤的結果.

下列選項控制特定的優化. `-O2'選項打開下面的大多數優化項,除了`-funroll-lo
ops'和 `-funroll-all-loops'項.

而`-O'選項通常打開`-fthread-jumps'和`-fdelayed-branch' 優化項,但是特定的
機器上的默認優化項有可能改變.

如果特別情況下非常需要``微調''優化,你可以使用下面的選項.

-fstrength-reduce

執行循環強度縮小(loop strength reduction)優化,並且消除重複變數.

-fthread-jumps

執行優化的地點是,如果某個跳轉分支的目的地存在另一個條件比較,而且該條件比
較包含在前一個比較語句之內,那麼 執行優化.根據條件是true或者false,前面那條
分支重定向到第二條分支的目的地或者緊跟在第二條分支後面.

-funroll-loops

執行循環展開(loop unrolling)優化.僅對循環次數能夠在編譯時或運行時確定的循
環實行.

-funroll-all-loops

執行循環展開(loop unrolling)優化.對所有循環實行.通常使程序運行的更慢.

-fcse-follow-jumps

在公共子表達式消元(common subexpression elimination)的時候,如果沒有其他路
徑到達某個跳轉的 目的地,就掃過這條jump指令.例如,如果CSE遇到帶有else從句的
if語句,當條件測試為 false時, CSE就跟在jump後面.

-fcse-skip-blocks

它類似於`-fcse-follow-jumps'選項,但是CSE跟在條件跳轉後面,條件跳轉跳過了
語句塊(block).如果CSE遇到一條簡單的if語句,不帶else從句, `-fcse-skip-bloc
ks'選項將導致CSE跟在if產生的跳轉後面.

-frerun-cse-after-loop

執行循環優化后,重新進行公共子表達式消元.

-felide-constructors

如果看上去合理就省略構造子(僅C++).根據這個選項,對於下面的代碼, GNU C++直
接從調用foo 初始化y,而無需通過臨時變數:

A foo (); A y = foo ();

如果沒有這個選項, GNU C++首先通過調用類型A 合適的構造子初始化y;然後把 fo
o的結果賦給臨時變數;最後,用臨時變數替換`y'的初始值.

ANSI C++標準草案規定了默認行為(`-fno-elide-constructors').如果程序的構造
子存在 副效應, `-felide-constructors'選項能夠使程序有不同的表現,因為可能
忽略一些構造子的調用.

-fexpensive-optimizations

執行一些相對開銷較大的次要優化.

-fdelayed-branch

如果對目標機支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed bra
nch)指令後面的指令空隙.

-fschedule-insns

如果對目標機支持這個功能,它試圖重新排列指令,以便消除因數據未緒造成的執行
停頓.這可以幫助浮點運算或內存訪問 較慢的機器調取指令,允許其他指令先執行,
直到調取指令或浮點運算完成.

-fschedule-insns2

類似於`-fschedule-insns'選項,但是在寄存器分配完成後,需要一個額外的指令調
度過程.對於 寄存器數目相對較少,而且取內存指令大於一個周期的機器,這個選項
特別有用.



目標機選項(TARGET OPTION)

預設情況下, GNU CC編譯出本機類型的目標碼.然而也可以把他安裝成交叉編譯器,
為其他機型編譯程序.事實上,針對不同的目標機,可以同時安裝GNU CC相應的配置
然後用`-b'選項指定 目標機種.

順便提一下,新版本和舊版本的GNU CC可以共存.其中一個版本(可能是最新的那個)
為預設版本,但是有時候你希望使用 其他版本.

-b machine

參數machine指出編譯的目標機種.這個選項用於安裝為交叉編譯器的GNU CC.

參數machine的值和配置GNU CC交叉編譯器時設置的機器類型一樣.例如,如果交叉編
譯器配置有 `configure i386v',意思是編譯80386上的System V目標碼,那麼你可以
通過`-b i386v'運行交叉編譯器.

如果沒有指定`-b'選項,通常指編譯本機目標碼.

-V version

參數version指出運行哪個版本的GNU CC.這個選項用於安裝了多個版本的GCC.例如
,如果 version是`2.0',意味著運行GNU CC 2.0版.

如果沒有指定`-V'選項,預設版本取決於GNU CC的安裝方式,一般說來推薦使用通用
版本.



機器相關選項(MACHINE DEPENDENT OPTION)

每一種目標機型都有自己的特別選項,這些選項用`-m '開關引導,選擇不同的硬體型
號或配置---例如, 68010還是68020,有沒有浮點協處理器.通過指定選項,安裝 編譯
器的一個版本能夠為所有的型號或配置進行編譯.

此外,編譯器的某些配置支持附加的特殊選項,通常是為了在命令行上兼容這個平台
的其他編譯器.

下面是針對68000系列定義的`-m'選項:

-m68000

-mc68000

輸出68000的目標碼.如果編譯器按基於68000的系統配置,這個選項就是預設選項.


-m68020

-mc68020

輸出68020的目標碼(而不是68000).如果編譯器按基於68020的系統配置,這個選項就
是預設選項.

-m68881

輸出包含68881浮點指令的目標碼.對於大多數基於68020的系統這是預設選項,除非
設置編譯器時指定了 -nfp .

-m68030

輸出68030的目標碼.如果編譯器按基於68030的系統配置,這個選項就是預設選項.


-m68040

輸出68040的目標碼.如果編譯器按基於68040的系統配置,這個選項就是預設選項.


-m68020-40

輸出68040的目標碼,但是不使用新指令.生成的代碼可以在68020/68881上,也可以在
68030或 68040上較有效地運行.

-mfpa

輸出包含SUN FPA浮點指令的目標碼.

-msoft-float

輸出包含浮點庫調用的目標碼. 警告:所需的庫不是GNU CC的組成部分.一般說來GC
C使用該機型本地C 編譯器的相應部件,但是作交叉編譯時卻不能直接使用.你必須自
己管理提供合適的函數庫用於交叉編譯.

-mshort

認為int類型是16位寬,相當於short int.

-mnobitfield

不使用位域(bit-field)指令. `-m68000'隱含指定了`-mnobitfield'.

-mbitfield

使用位域指令. `-m68020'隱含指定了`-mbitfield'.如果你使用未改裝的gcc,這就
是 默認選項.

-mrtd

採用另一種函數調用約定,函數接受固定數目的參數,用rtd指令返回,該指令返回時
彈出棧內的參數.這個 方法能夠使調用者節省一條指令,因為他這裡不需要彈出參數


這種調用約定不兼容UNIX的正常調用.因此如果你需要調用UNIX編譯器編譯的庫函數
,你就不能使用這個選項.

此外,所有參數數量可變地函數必須提供函數原型(包括printf);否則編譯器會生成
錯誤的調用代碼.

另外,如果調用函數時攜帶了過多的參數,編譯器將生成嚴重錯誤的代碼. (正常情況
下,多餘的參數被安全無害的忽略.)

68010和68020處理器支持rtd指令,但是68000不支持.

下面是針對VAX定義的`-m'選項:

-munix

禁止輸出某些跳轉指令(aobleq等等), VAX的UNIX彙編器無法跨越長範圍(long ran
ges) 進行處理.

-mgnu

如果使用GNU彙編器,則輸出那些跳轉指令,

-mg

輸出g-format浮點數,取代d-format.

下面是SPARC支持的`-m'選項開關:

-mfpu

-mhard-float

輸出包含浮點指令的目標碼.這是預設選項.

-mno-fpu

-msoft-float

輸出包含浮點庫調用的目標碼. 警告:沒有為SPARC提供GNU浮點庫.一般說來使用該
機型本地C編譯器 的相應部件,但是不能直接用於交叉編譯.你必須自己安排,提供用
於交叉編譯的庫函數.

-msoft-float改變了輸出文件中的調用約定;因此只有用這個選項編譯整個程序才有
意義.

-mno-epilogue

-mepilogue

使用-mepilogue (預設)選項時,編譯器總是把函數的退出代碼放在函數的尾部.任何
在函數中間 的退出語句(例如C中的return語句)將產生出跳轉指令指向函數尾部.


使用-mno-epilogue選項時,編譯器盡量在每個函數退出點嵌入退出代碼.

-mno-v8

-mv8

-msparclite

這三個選項選擇不同種類的SPARC系統.

默認情況下(除非特別為Fujitsu SPARClite配置), GCC生成SPARC v7目標碼.

-mv8生成SPARC v8目標碼.他和v7目標碼唯一的區別是,編譯器生成整數乘法和整數
除法指令, SPARC v8支持該指令,而v7體系不支持.

-msparclite生成SPARClite目標碼.增加了SPARClite支持的整數乘法,整數除法單步
掃描 (integer divide step and scan (ffs))指令. v7體系不支持這些指令.

-mcypress

-msupersparc

這兩個選項選擇處理器型號,針對處理器進行代碼優化.

-mcypress選項(默認項)使編譯器對Cypress CY7C602晶元優化代碼, SparcStation
/SparcServer 3xx系列使用這種晶元.該選項也適用於老式的SparcStation 1, 2,
IPX 等機型..

-msupersparc選項使編譯器對SuperSparc處理器優化代碼, SparcStation 10, 100
0 和2000系列使用這種晶元.同時該選項啟用完整的SPARC v8指令集.

下面是針對Convex定義的`-m'選項:

-mc1

輸出C1的目標碼.當編譯器對C1配置時,這是默認選項.

-mc2

輸出C2的目標碼.當編譯器對C2配置時,這是默認選項.

-margcount

在每個參數列表的前面放置一個參數計數字(argument count word).某些不可移植
的Convex和Vax 程序需要這個參數計數字. (調試器不需要他,除非函數帶有變長參
數列表;這個信息存放在符號表中.)

-mnoargcount

忽略參數計數字.如果你使用未改裝的gcc,這是默認選項.

下面是針對AMD Am29000定義的`-m'選項:

-mdw

生成的目標碼認為DW置位,就是說,位元組和半字操作由硬體直接支持.該選項是默認選
項.

-mnodw

生成的目標碼認為DW沒有置位.

-mbw

生成的目標碼認為系統支持位元組和半字寫操作.該選項是默認選項.

-mnbw

生成的目標碼認為系統不支持位元組和半字寫操作.該選項隱含開啟了`-mnodw'選項.


-msmall

使用小內存模式,小內存模式假設所有函數的地址位於某個256 KB段內,或者所有函
數的絕對地址小於256K.這樣 就可以用call指令代替const, consth, calli指令序
列.

-mlarge

假設不能使用call指令;這是默認選項.

-m29050

輸出Am29050的目標碼.

-m29000

輸出Am29000的目標碼.這是默認選項.

-mkernel-registers

生成的目標碼引用gr64-gr95寄存器而不是gr96-gr127寄存器.該選項可以用於編譯
內核代碼,內核需要一組全局寄存器,這些全局寄存器和用戶模式使用的寄存器完全
無關.

注意,使用這個選項時, `-f'選項中的寄存器名字必須是normal, user-mode, name
s.

-muser-registers

使用普通全局寄存器集gr96-gr127.這是默認選項.

-mstack-check

在每次堆棧調整后插入一條__msp_check調用.這個選項常用於內核代碼.

下面是針對Motorola 88K體系定義的`-m'選項:

-m88000

生成的目標碼可以在m88100和m88110上正常工作.

-m88100

生成的目標碼在m88100上工作的最好,但也可以在m88110上運行.

-m88110

生成的目標碼在m88110上工作的最好,可能不能在m88100上運行.

-midentify-revision

在彙編器的輸出端包含一條ident指令,記錄源文件名,編譯器名字和版本,時標,以及
使用的編譯選項,

-mno-underscores

在彙編器的輸出端,符號名字前面不添加下劃線.默認情況是在每個名字前面增加下
劃線前綴.

-mno-check-zero-division

-mcheck-zero-division

早期型號的88K系統在除零操作上存在問題,特定情況下許多機器無法自陷.使用這些
選項可以避免包含(或可以 顯明包含)附加的代碼,這些代碼能夠檢查除零錯,發送例
外信號. GCC所有88K的配置默認使用 `-mcheck-zero-division'選項.

-mocs-debug-info

-mno-ocs-debug-info

包含(或忽略)附加的調試信息(關於每個棧架結構中寄存器的使用), 88Open Objec
t Compatibility Standard, ``OCS'',對此信息做了說明. GDB不需要這些額外信息
DG/UX, SVr4,和Delta 88 SVr3.2的默認配置是包含調試信息,其他88k機型的默認
配置是忽略這個信息.

-mocs-frame-position

-mno-ocs-frame-position

強制(或不要求)把寄存器值存儲到棧架結構中的指定位置(按OCS的說明). DG/UX,
Delta88 SVr3.2和 BCS的默認配置使用`-mocs-frame-position'選項;其他88k機型
的默認配置是 `-mno-ocs-frame-position'.

-moptimize-arg-area

-mno-optimize-arg-area

控制如何在堆棧結構中存儲函數參數. `-moptimize-arg-area'節省空間,但是有可
能宕掉某些 調試器(不是GDB). `-mno-optimize-arg-area'證實比標準選項好.默認
情況下GCC不優化參數域.

-mshort-data-

num通過和r0關聯,產生較小的數據引用(data reference),這樣就可以用單指令調入
一個數值(而不是平常的雙指令).用戶通過選項中的num控制改變哪種數據引用.例
如,如果你指定了 `-mshort-data-512',那麼受影響的數據引用是小於512位元組的數
據移動. -mshort-data-num選項對大於64K的num 無效.

-mserialize-volatile

-mno-serialize-volatile

產生,或不產生代碼來保證對易變內存訪問的結果一致.

對於常用的處理器子型號, GNU CC始終默認保證這種一致性.如何實現結果一致取決
於處理器子型號.

m88100處理器不對內存引用重新安排,因此訪問結果始終一致.如果使用了`-m88100
'選項, GNU CC 不產生任何針對結果一致的特別指令.

m88110處理器的內存引用順序並不始終符合指令請求的引用順序.特別是某條讀取指
令可能在先前的存儲指令之前執行. 多處理器環境下,亂序訪問擾亂了易變內存訪問
的結果一致.因此當使用`-m88000'或`-m88110' 選項時, GNU CC在適當的時候產生
特別的指令迫使執行順序正確.

這些用於保證一致性的額外代碼有可能影響程序的性能.如果你確認能夠安全地放棄
這種保證,你可以使用 `-mno-serialize-volatile'選項.

如果你使用`-m88100'選項,但是需要在m88110處理器上運行時的結果一致,你應該加
上 `-mserialize-volatile'選項.

-msvr4

-msvr3

打開(`-msvr4')或關閉(`-msvr3')和System V第四版(SVr4)相關的 編譯器擴展.效
果如下:

*

輸出哪種彙編語法(你可以使用`-mversion-03.00'選項單獨選擇).

*

`-msvr4'使C預處理器識別`#pragma weak'指令

*

`-msvr4'使GCC輸出額外的聲明指令(declaration directive),用於SVr4.

除了SVr4配置, `-msvr3'是所有m88K配置的默認選項.

-mtrap-large-shift

-mhandle-large-shift

包含一些指令,用於檢測大於31位的位移(bit-shift);根據相應的選項,對這樣的位
移發出自陷 (trap)或執行適當的處理代碼.默認情況下, GCC對大位移不做特別處理


-muse-div-instruction

很早以前的88K型號沒有(div)除法指令,因此默認情況下GCC避免產生這條指令.而這
個選項告訴GCC該指令是 安全的.

-mversion-03.00

在DG/UX配置中存在兩種風格的SVr4.這個選項修改-msvr4 ,選擇hybrid-COFF或 re
al-ELF風格.其他配置均忽略該選項.

-mwarn-passed-structs

如果某個函數把結構當做參數或結果傳遞, GCC發出警告.隨著C語言的發展,人們已
經改變了傳遞結構的約定, 它往往導致移植問題.默認情況下, GCC不會發出警告.


下面的選項用於IBM RS6000:

-mfp-in-toc

-mno-fp-in-toc

控制是否把浮點常量放到內容表(TOC)中,內容表存放所有的全局變數和函數地址.默
認情況下, GCC把浮點常量放到 這裡;如果TOC溢出, `-mno-fp-in-toc'選項能夠減
少TOC的大小,這樣就可以避免溢出.

下面的`-m'選項用於IBM RT PC:

-min-line-mul

對於整數乘法使用嵌入代碼.這是默認選項.

-mcall-lib-mul

對於整數乘法使用lmul$$ .

-mfull-fp-blocks

生成全尺寸浮點數據塊,包括IBM建議的最少數量的活動空間(scratch space).這是
默認選項.

-mminimum-fp-blocks

不要在浮點數據塊中包括額外的活動空間.這樣就產生較小但是略慢的可執行程序,
因為活動空間必須動態分配.

-mfp-arg-in-fpregs

採用不兼容IBM調用約定的調用序列,通過浮點寄存器傳送浮點參數.注意,如果指定
了這個選項, varargs.h和stdargs.h將無法支持浮點單元.

-mfp-arg-in-gregs

使用正常的調用約定處理浮點參數.這是默認選項.

-mhc-struct-return

通過內存返回大於一個字的結構,而不是通過寄存器.用於兼容MetaWare HighC (hc
)編譯器.使用 `-fpcc-struct-return'選項可以兼容Portable C編譯器(pcc).

-mnohc-struct-return

如果可以,通過寄存器返回某些大於一個字的結構.這是默認選項.如果打算兼容IBM
提供的編譯器,請使用 `-fpcc-struct-return'或`-mhc-struct-return'選項.

[火星人 ] gcc使用手冊(3)已經有628次圍觀

http://coctec.com/docs/linux/show-post-190416.html