下面的`-m'選項用於MIPS家族的計算機:
-mcpu=cpu-type
生成指令的時候,假設默認的機器類型是cpu-type .默認情況下的cpu-type是 defa
ult, GCC將選取任何機型上都是最長周期時間的指令,這樣才能使代碼在所有的MIP
S處理器上以合理 的速度運行. cpu-type的其他選擇是r2000, r3000, r4000,和 r
6000.雖然選定某個cpu-type後, GCC將針對選定的芯片安排對應的工作,但是如果
不指定?? -mips2或-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instructio
n set architecture)一級的代碼.
-mips2
輸出MIPS ISA二級指令(可能的擴展,如平方根指令). -mcpu=r4000或-mcpu=r6000
選項必須和-mips2聯用.
-mips3
輸出MIPS ISA三級指令(64位指令). -mcpu=r4000選項必須和-mips2聯用. (譯注:疑
為-mips3)
-mint64
-mlong64
-mlonglong128
這些選項目前不起作用.
-mmips-as
產生用於MIPS匯編器的代碼,同時使用mips-tfile添加普通的調試信息.對於大多數
平台這是 默認選項,除了OSF/1參考平台,它使用OSF/rose目標格式.如果打開了任一
個-ggdb, -gstabs,或-gstabs+選項開關, mips-tfile程序就把stab封裝在MIPS EC
OFF裡面.
-mgas
產生用於GNU匯編器的代碼.在OSF/1參考平台上這是默認選項,它使用OSF/rose目標
格式.
-mrnames
-mno-rnames
-mrnames開關選項告訴輸出代碼使用MIPS軟件名稱說明寄存器,而不是硬件名稱(就
是說,用 a0代替). GNU匯編器不支持-mrnames選項,而MIPS匯編器則運行MIPS C預
處理器處理源文件. -mno-rnames是默認選項.
-mgpopt
-mno-gpopt
-mgpopt開關選項要求在正文段中把所有的數據聲明寫到指令前面,使各種MIPS匯編
器對短類型全局 或靜態數據項(short global or static data items)輸出單字內
存訪問而不是雙字內存訪問.當打開編譯優化 時,這是默認功能.
-mstats
-mno-stats
每次處理完非嵌入函數(non-inline function)後, -mstats開關選項使編譯器向標
准錯誤文件 輸出一行關於程序的統計資料(保存的寄存器數目,堆棧大小,等等).
-mmemcpy
-mno-memcpy
-mmemcpy開關選項使所有的塊移動操作調用適當的string函數(memcpy或 bcopy),而
不是生成嵌入代碼.
-mmips-tfile
-mno-mips-tfile
當MIPS匯編器生成mips-tfile文件(用於幫助調試)後, -mno-mips-tfile 開關選項
阻止編譯器使用mips-tfile後期處理(postprocess)目標文件.不運行 mips-tfile就
沒有調試器關注的局部變量.另外, stage2和stage3目標文件將把 臨時文件名傳遞
給匯編器,嵌在目標文件中,這意味著不比較目標文件是否相同.
-msoft-float
輸出包含浮點庫調用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機型本地
C編譯器的相應部件, 但是不能直接用於交叉編譯,你必須自己安排,提供交叉編譯適
用的庫函數.
-mhard-float
輸出包含浮點指令.如果編譯器沒有被改動,這就是默認選項.
-mfp64
編譯器認為狀態字的FR置位(on),也就是說存在32 64-bit浮點寄存器,而不是32 32
-bit 浮點寄存器.同時必須打開-mcpu=r4000和-mips3開關.
-mfp32
認為存在32 32-bit浮點寄存器.這是默認選項.
-mabicalls
-mno-abicalls
輸出(或不輸出) .abicalls, .cpload,和.cprestore偽指令,某些 System V.4版本
用於位置無關代碼.
-mhalf-pic
-mno-half-pic
-mhalf-pic開關選項要求把外部引用的指針放到數據段,並且載入內存,而不放到正
文段.該選項目前 不起作用.
-G num
把小於等於num字節的全局或靜態數據放到小的數據段或bss段,而不是普通的數據段
或bss段. 這樣匯編器可以輸出基於全局指針(gp或Cool,的單字內存訪問指令而非普
通的雙字指令.默認情況下, 用MIPS匯編器時num是8,而GNU匯編器則為0.另外, -Gn
um選項也被傳遞 給匯編器和連接器.所有的模塊必須在相同的-Gnum值下編譯.
-nocpp
匯編用戶匯編文件(帶有`.s'後綴)時,告訴MIPS匯編器不要運行預處理器.
下面的`-m'選項用於Intel 80386族計算機: -m486
-mno-486
控制是否生成對486優化的代碼.
-msoft-float
輸出包含浮點庫調用. 警告: 所需庫不是GNU CC的一部分.一般說來使用該機型本地
C編譯器的相應部件, 但是不能直接用於交叉編譯,你必須自己安排,提供交叉編譯適
用的庫函數.
在函數把浮點返回值放在80387寄存器棧的機器上,即使設置了`-msoft-float'選項
,也可能會發出 一些浮點操作碼.
-mno-fp-ret-in-387
不用FPU寄存器返回函數值.
通常函數調用約定把float和double的返回值放在FPU寄存器中,即使不存在FPU. 這
種作法的理念是操作系統應該仿真出FPU.
而`-mno-fp-ret-in-387'選項使浮點值通過普通的CPU寄存器返回.
下面的`-m'選項用於HPPA族計算機:
-mpa-risc-1-0
生成PA 1.0處理器的目標碼.
-mpa-risc-1-1
生成PA 1.1處理器的目標碼.
-mkernel
生成適用於內核的目標碼.特別要避免add指令,它有一個參數是DP寄存器;用addil
代替add指令.這樣可以避免HP-UX連接器的某個嚴重bug.
-mshared-libs
生成能夠連接HP-UX共享庫的目標碼.該選項還沒有實現全部功能,對PA目標默認為關
閉.使用這個選項會導致 編譯器生成錯誤的目標碼.
-mno-shared-libs
不生成連接HP-UX共享庫的目標碼.這是PA目標的默認選項.
-mlong-calls
生成的目標碼允許同一個源文件中的函數調用,調用點和被調函數的距離可以超過2
56K之遠.不需要打開這個開關選項, 除非連接器給出``branch out of range erro
rs``這樣的錯誤.
-mdisable-fpregs
防止任何情況下使用浮點寄存器.編譯內核需要這個選項,內核切換浮點寄存器的執
行環境速度非常緩慢.如果打開了這個 開關選項同時試圖浮點操作,編譯將失敗.
-mdisable-indexing
防止編譯器使用索引地址模式(indexing address mode).這樣在MACH上編譯MIG生成
的代碼時,可以 避免一些非常晦澀的問題.
-mtrailing-colon
在標記定義(label definition)的末尾添加一個冒號(用於ELF匯編器).
下面的`-m'選項用於Intel 80960族計算機:
-mcpu-type
默認機器類型為cpu-type ,使編譯器產生對應的指令,地址模式和內存對齊.默認的
cpu-type是kb;其他選擇有ka, mc, ca, cf, sa,和sb.
-mnumerics
-msoft-float
-mnumerics開關選項指出處理器不支持浮點指令. -msoft-float開關選項指出不應
該認為 機器支持浮點操作.
-mleaf-procedures
-mno-leaf-procedures
企圖(或防止)改變葉過程(leaf procedure),使其可被bal指令以及call指令 調用.
對於直接函數調用,如果bal指令能夠被匯編器或連接器替換,這可以產生更有效的代
碼,但是其他情況下 產生較低效的代碼,例如通過函數指針調用函數,或使用了不支
持這種優化的連接器.
-mtail-call
-mno-tail-call
執行(或不執行)更多的嘗試(除過編譯器那些機器無關部分),優化進入分支的尾遞歸
(tail-recursive)調用.你 可能不需要這個,因為檢測什麼地方無效沒有全部完成.
默認開關是-mno-tail-call.
-mcomplex-addr
-mno-complex-addr
認為(或不認為)在當前的i960設備上,值得使用復合地址模式(complex addressing
mode).復合地址模式 可能不值得用到K系列,但是一定值得用在C系列.目前除了CB
和CC處理器,其他處理器上 -mcomplex-addr是默認選項.
-mcode-align
-mno-code-align
把目標碼對齊到8字節邊界上(或者不必),這樣讀取會快一些.目前只對C系列默認打
開.
-mic-compat
-mic2.0-compat
-mic3.0-compat
兼容iC960 v2.0或v3.0.
-masm-compat
-mintel-asm
兼容iC960匯編器.
-mstrict-align
-mno-strict-align
不允許(或允許)邊界不對齊的訪問.
-mold-align
使結構對齊(structure-alignment)兼容Intel的gcc發行版本1.3 (基於gcc 1.37).
目前 這個選項有點問題,因為#pragma align 1總是作同樣的設定,而且無法關掉.
下面的`-m'選項用於DEC Alpha設備:
-mno-soft-float
-msoft-float
使用(或不使用)硬件浮點指令進行浮點運算.打開-msoft-float時,將使用 `libgcc
1.c'中的函數執行浮點運算.除非它們被仿真浮點操作的例程替換,或者類似,它們被
編譯為調用 仿真例程,這些例程將發出浮點操作.如果你為不帶浮點操作的Alpha編
譯程序,你必須確保建立了這個庫,以便不調用 仿真例程.
注意,不帶浮點操作的Alpha也要求擁有浮點寄存器.
-mfp-reg
-mno-fp-regs
生成使用(或不使用)浮點寄存器群的目標代碼. -mno-fp-regs包含有-msoft-float
開關選項.如果不使用浮點寄存器,浮點操作數就象整數一樣通過整數寄存器傳送,
浮點運算結果放到而不是$f0.這是非標准 調用,因此任何帶有浮點參數或返回值
的函數,如果被-mno-fp-regs開關編譯過的目標碼調用,它也必須 用這個選項編譯.
這個選項的典型用法是建立內核,內核不使用任何浮點寄存器,因此沒必要保存和恢
復這些寄存器.
下面附加的選項出現在System V第四版中,用於兼容這些系統中的其他編譯器:
-G
在SVr4系統中, gcc出於兼容接受了`-G'選項(然後傳遞給連接器).可是我們建議使
用 `-symbolic'或`-shared'選項,而不在gcc命令行上出現連接選項.
-Qy
驗證編譯器用的工具的版本,輸出到.ident匯編指令.
-Qn
制止輸出端的.ident指令(默認選項).
-YP,dirs
對於`-l'指定的庫文件,只搜索dirs.你可以在dirs中用冒號隔開各個 目錄項.
-Ym,dir
在dir目錄中尋找M4預處理器.匯編器使用這個選項.
代碼生成選項(CODE GENERATION OPTION)
下面的選項和平台無關,用於控制目標碼生成的接口約定.
大部分選項以`-f'開始.這些選項擁有確定和否定兩種格式; `-ffoo'的否定格式是
`-fno-foo'.後面的描述將只列舉其中的一個格式---非默認的格式.你可以通過添
加或去掉 `no-'推測出另一個格式.
-fnonnull-objects
假設通過引用(reference)取得的對象不為null (僅C++).
一般說來, GNU C++對通過引用取得的對象作保守假設.例如,編譯器一定會檢查下似
代碼中的a不為 null:
obj &a = g (); a.f (2);
檢查類似的引用需要額外的代碼,然而對於很多程序是不必要的.如果你的程序不要
求這種檢查,你可以用 `-fnonnull-objects'選項忽略它.
-fpcc-struct-return
函數返回struct和union值時,采用和本地編譯器相同的參數約定.對於較小的結構,
這種約定的效率偏低,而且很多機器上不能重入;它的優點是允許GCC編譯的目標碼
和PCC編譯的目標碼互相調用.
-freg-struct-return
一有可能就通過寄存器返回struct和union函數值.對於較小的結構,它比 -fpcc-st
ruct-return更有效率.
如果既沒有指定-fpcc-struct-return ,也沒有指定-freg-struct-return, GNU CC
默認使用目標機的標准約定.如果沒有標准約定, GNU CC默認采用-fpcc-struct-re
turn.
-fshort-enums
給enum類型只分配它聲明的值域范圍的字節數.就是說, enum類型等於大小足夠的
最小整數類型.
-fshort-double
使double類型的大小和float一樣.
-fshared-data
要求編譯結果的數據和非const變量是共享數據,而不是私有數據.這種差別僅在某些
操作系統上面有意義, 那裡的共享數據在同一個程序的若干進程間共享,而私有數據
在每個進程內都有副件.
-fno-common
即使未初始化的全局變量也分配在目標文件的bss段,而不是把它們當做普通塊(com
mon block)建立.這樣的 結果是,如果在兩個不同的編譯結果中聲明了同一個變量(
沒使用extern ),連接它們時會產生錯誤. 這個選項可能有用的唯一情況是,你希望
確認程序能在其他系統上運行,而其他系統總是這麼做.
-fno-ident
忽略`#ident'指令.
-fno-gnu-linker
不要把全局初始化部件(如C++的構造子和解構子)輸出為GNU連接器使用的格式(在G
NU連接器是標准方法的系統 上).當你打算使用非GNU連接器的時候可以用這個選項
,非GNU連接器也需要collect2程序確保系統連接器 放入構造子(constructor)和解
構子(destructor). (GNU CC的發布包中包含有collect2 程序.)對於必須使用coll
ect2的系統,編譯器驅動程序gcc自動配置為這麼做.
-finhibit-size-directive
不要輸出.size匯編指令,或其他類似指令,當某個函數一分為二,兩部分在內存中距
離很遠時會引起問題. 當編譯`crtstuff.c'時需要這個選項;其他情況下都不應該使
用.
-fverbose-asm
輸出匯編代碼時放些額外的注釋信息.這個選項僅用於確實需要閱讀匯編輸出的時候
(可能調試編譯器自己的時候).
-fvolatile
使編譯器認為所有通過指針訪問的內存是易變內存(volatile).
-fvolatile-global
使編譯器認為所有的外部和全局變量是易變內存.
-fpic
如果支持這種目標機,編譯器就生成位置無關目標碼.適用於共享庫(shared librar
y).
-fPIC
如果支持這種目標機,編譯器就輸出位置無關目標碼.適用於動態連接(dynamic lin
king),即使分支需要大范圍 轉移.
-ffixed-reg
把名為reg的寄存器按固定寄存器看待(fixed register);生成的目標碼不應該引用
它(除了或許 用作棧指針,幀指針,或其他固定的角色).
reg必須是寄存器的名字.寄存器名字取決於機器,用機器描述宏文件的REGISTER_NA
MES宏 定義.
這個選項沒有否定格式,因為它列出三路選擇.
-fcall-used-reg
把名為reg的寄存器按可分配寄存器看待,不能在函數調用間使用.可以臨時使用或當
做變量使用,生存期 不超過一個函數.這樣編譯的函數無需保存和恢復reg寄存器.
如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,
如棧指針或幀指針.
這個選項沒有否定格式,因為它列出三路選擇.
-fcall-saved-reg
把名為reg的寄存器按函數保護的可分配寄存器看待.可以臨時使用或當做變量使用
,它甚至能在函數間 生存.這樣編譯的函數會保存和恢復使用中的reg寄存器.
如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,
如棧指針或幀指針.
另一種災難是用這個選項說明的寄存器返回函數值.
這個選項沒有否定格式,因為它列出三路選擇.
PRAGMAS
GNU C++支持兩條`#pragma'指令使同一個頭文件有兩個用途:對象類的接口定義, 對
象類完整的內容定義.
#pragma interface
(僅對C++)在定義對象類的頭文件中,使用這個指令可以節省大部分采用該類的目標
文件的大小.一般說來,某些信息 (內嵌成員函數的備份副件,調試信息,實現虛函數
的內部表格等)的本地副件必須保存在包含類定義的各個目標文件中.使用這個 pra
gma指令能夠避免這樣的復制.當編譯中引用包含`#pragma interface'指令的頭文件
時,就 不會產生這些輔助信息(除非輸入的主文件使用了`#pragma implementation
'指令).作為替代,目標文件 將包含可被連接時解析的引用(reference).
#pragma implementation
#pragma implementation "objects.h"
(僅對C++)如果要求從頭文件產生完整的輸出(並且全局可見),你應該在主輸入文件
中使用這條pragma.頭文件 中應該依次使用`#pragma interface'指令.在implemen
tation文件中將產生全部內嵌成員函數 的備份,調試信息,實現虛函數的內部表格等
如果`#pragma implementation'不帶參數,它指的是和源文件有相同基本名的包含文
件;例如, `allclass.cc'中, `#pragma implementation'等於`#pragma implement
ation allclass.h'.如果某個implementation文件需要從多個頭文件引入代碼,就應
該 使用這個字符串參數.
不可能把一個頭文件裡面的內容分割到多個implementation文件中.
文件(FILE)
file.c C源文件
file.h C頭文件(預處理文件)
file.i 預處理後的C源文件
file.C C++源文件
file.cc C++源文件
file.cxx C++源文件
file.m Objective-C源文件
file.s 匯編語言文件
file.o 目標文件
a.out 連接的輸出文件
TMPDIR/cc* 臨時文件
LIBDIR/cpp 預處理器
LIBDIR/cc1 C編譯器
LIBDIR/cc1plus C++編譯器
LIBDIR/collect