GCC 5
Section: GNU Tools (1)
Updated: 2003/12/05
Sponsor: GCC Casino Winning Content
-
下面的`-m'選項(xiàng)用于HPPA族計(jì)算機(jī):
- -mpa-risc-1-0
- 生成PA 1.0處理器的目標(biāo)碼.
- -mpa-risc-1-1
- 生成PA 1.1處理器的目標(biāo)碼.
- -mkernel
- 生成適用于內(nèi)核的目標(biāo)碼.特別要避免add指令,它有一個(gè)參數(shù)是DP寄存器;用addil 代替add指令.這樣可以避免HP-UX連接器的某個(gè)嚴(yán)重bug.
- -mshared-libs
- 生成能夠連接HP-UX共享庫(kù)的目標(biāo)碼.該選項(xiàng)還沒(méi)有實(shí)現(xiàn)全部功能,對(duì)PA目標(biāo)默認(rèn)為關(guān)閉.使用這個(gè)選項(xiàng)會(huì)導(dǎo)致 編譯器生成錯(cuò)誤的目標(biāo)碼.
- -mno-shared-libs
- 不生成連接HP-UX共享庫(kù)的目標(biāo)碼.這是PA目標(biāo)的默認(rèn)選項(xiàng).
- -mlong-calls
- 生成的目標(biāo)碼允許同一個(gè)源文件中的函數(shù)調(diào)用,調(diào)用點(diǎn)和被調(diào)函數(shù)的距離可以超過(guò)256K之遠(yuǎn).不需要打開這個(gè)開關(guān)選項(xiàng), 除非連接器給出``branch out of range errors``這樣的錯(cuò)誤.
- -mdisable-fpregs
- 防止任何情況下使用浮點(diǎn)寄存器.編譯內(nèi)核需要這個(gè)選項(xiàng),內(nèi)核切換浮點(diǎn)寄存器的執(zhí)行環(huán)境速度非常緩慢.如果打開了這個(gè) 開關(guān)選項(xiàng)同時(shí)試圖浮點(diǎn)操作,編譯將失敗.
- -mdisable-indexing
- 防止編譯器使用索引地址模式(indexing address mode).這樣在MACH上編譯MIG生成的代碼時(shí),可以 避免一些非常晦澀的問(wèn)題.
- -mtrailing-colon
- 在標(biāo)記定義(label definition)的末尾添加一個(gè)冒號(hào)(用于ELF匯編器).
下面的`-m'選項(xiàng)用于Intel 80960族計(jì)算機(jī):
- -mcpu-type
- 默認(rèn)機(jī)器類型為cpu-type ,使編譯器產(chǎn)生對(duì)應(yīng)的指令,地址模式和內(nèi)存對(duì)齊.默認(rèn)的 cpu-type是kb;其他選擇有ka, mc, ca, cf, sa,和sb.
- -mnumerics
-
- -msoft-float
- -mnumerics開關(guān)選項(xiàng)指出處理器不支持浮點(diǎn)指令. -msoft-float開關(guān)選項(xiàng)指出不應(yīng)該認(rèn)為 機(jī)器支持浮點(diǎn)操作.
- -mleaf-procedures
-
- -mno-leaf-procedures
- 企圖(或防止)改變?nèi)~過(guò)程(leaf procedure),使其可被bal指令以及call指令 調(diào)用.對(duì)于直接函數(shù)調(diào)用,如果bal指令能夠被匯編器或連接器替換,這可以產(chǎn)生更有效的代碼,但是其他情況下 產(chǎn)生較低效的代碼,例如通過(guò)函數(shù)指針調(diào)用函數(shù),或使用了不支持這種優(yōu)化的連接器.
- -mtail-call
-
- -mno-tail-call
- 執(zhí)行(或不執(zhí)行)更多的嘗試(除過(guò)編譯器那些機(jī)器無(wú)關(guān)部分),優(yōu)化進(jìn)入分支的尾遞歸(tail-recursive)調(diào)用.你 可能不需要這個(gè),因?yàn)闄z測(cè)什么地方無(wú)效沒(méi)有全部完成.默認(rèn)開關(guān)是-mno-tail-call.
- -mcomplex-addr
-
- -mno-complex-addr
- 認(rèn)為(或不認(rèn)為)在當(dāng)前的i960設(shè)備上,值得使用復(fù)合地址模式(complex addressing mode).復(fù)合地址模式 可能不值得用到K系列,但是一定值得用在C系列.目前除了CB和CC處理器,其他處理器上 -mcomplex-addr是默認(rèn)選項(xiàng).
- -mcode-align
-
- -mno-code-align
- 把目標(biāo)碼對(duì)齊到8字節(jié)邊界上(或者不必),這樣讀取會(huì)快一些.目前只對(duì)C系列默認(rèn)打開.
- -mic-compat
-
- -mic2.0-compat
-
- -mic3.0-compat
- 兼容iC960 v2.0或v3.0.
- -masm-compat
-
- -mintel-asm
- 兼容iC960匯編器.
- -mstrict-align
-
- -mno-strict-align
- 不允許(或允許)邊界不對(duì)齊的訪問(wèn).
- -mold-align
- 使結(jié)構(gòu)對(duì)齊(structure-alignment)兼容Intel的gcc發(fā)行版本1.3 (基于gcc 1.37).目前 這個(gè)選項(xiàng)有點(diǎn)問(wèn)題,因?yàn)?/font>#pragma align 1總是作同樣的設(shè)定,而且無(wú)法關(guān)掉.
下面的`-m'選項(xiàng)用于DEC Alpha設(shè)備:
- -mno-soft-float
-
- -msoft-float
- 使用(或不使用)硬件浮點(diǎn)指令進(jìn)行浮點(diǎn)運(yùn)算.打開-msoft-float時(shí),將使用 `libgcc1.c'中的函數(shù)執(zhí)行浮點(diǎn)運(yùn)算.除非它們被仿真浮點(diǎn)操作的例程替換,或者類似,它們被編譯為調(diào)用 仿真例程,這些例程將發(fā)出浮點(diǎn)操作.如果你為不帶浮點(diǎn)操作的Alpha編譯程序,你必須確保建立了這個(gè)庫(kù),以便不調(diào)用 仿真例程.
注意,不帶浮點(diǎn)操作的Alpha也要求擁有浮點(diǎn)寄存器.
- -mfp-reg
-
- -mno-fp-regs
- 生成使用(或不使用)浮點(diǎn)寄存器群的目標(biāo)代碼. -mno-fp-regs包含有-msoft-float 開關(guān)選項(xiàng).如果不使用浮點(diǎn)寄存器,浮點(diǎn)操作數(shù)就象整數(shù)一樣通過(guò)整數(shù)寄存器傳送,浮點(diǎn)運(yùn)算結(jié)果放到$0而不是$f0.這是非標(biāo)準(zhǔn) 調(diào)用,因此任何帶有浮點(diǎn)參數(shù)或返回值的函數(shù),如果被-mno-fp-regs開關(guān)編譯過(guò)的目標(biāo)碼調(diào)用,它也必須 用這個(gè)選項(xiàng)編譯.
這個(gè)選項(xiàng)的典型用法是建立內(nèi)核,內(nèi)核不使用任何浮點(diǎn)寄存器,因此沒(méi)必要保存和恢復(fù)這些寄存器.
下面附加的選項(xiàng)出現(xiàn)在System V第四版中,用于兼容這些系統(tǒng)中的其他編譯器:
- -G
- 在SVr4系統(tǒng)中, gcc出于兼容接受了`-G'選項(xiàng)(然后傳遞給連接器).可是我們建議使用 `-symbolic'或`-shared'選項(xiàng),而不在gcc命令行上出現(xiàn)連接選項(xiàng).
- -Qy
- 驗(yàn)證編譯器用的工具的版本,輸出到.ident匯編指令.
- -Qn
- 制止輸出端的.ident指令(默認(rèn)選項(xiàng)).
- -YP,dirs
- 對(duì)于`-l'指定的庫(kù)文件,只搜索dirs.你可以在dirs中用冒號(hào)隔開各個(gè) 目錄項(xiàng).
- -Ym,dir
- 在dir目錄中尋找M4預(yù)處理器.匯編器使用這個(gè)選項(xiàng).
代碼生成選項(xiàng)(CODE GENERATION OPTION)
下面的選項(xiàng)和平臺(tái)無(wú)關(guān),用于控制目標(biāo)碼生成的接口約定.
大部分選項(xiàng)以`-f'開始.這些選項(xiàng)擁有確定和否定兩種格式; `-ffoo'的否定格式是 `-fno-foo'.后面的描述將只列舉其中的一個(gè)格式---非默認(rèn)的格式.你可以通過(guò)添加或去掉 `no-'推測(cè)出另一個(gè)格式.
- -fnonnull-objects
- 假設(shè)通過(guò)引用(reference)取得的對(duì)象不為null (僅C++).
一般說(shuō)來(lái), GNU C++對(duì)通過(guò)引用取得的對(duì)象作保守假設(shè).例如,編譯器一定會(huì)檢查下似代碼中的a不為 null:
obj &a = g (); a.f (2);
檢查類似的引用需要額外的代碼,然而對(duì)于很多程序是不必要的.如果你的程序不要求這種檢查,你可以用 `-fnonnull-objects'選項(xiàng)忽略它.
- -fpcc-struct-return
- 函數(shù)返回struct和union值時(shí),采用和本地編譯器相同的參數(shù)約定.對(duì)于較小的結(jié)構(gòu), 這種約定的效率偏低,而且很多機(jī)器上不能重入;它的優(yōu)點(diǎn)是允許GCC編譯的目標(biāo)碼和PCC編譯的目標(biāo)碼互相調(diào)用.
- -freg-struct-return
- 一有可能就通過(guò)寄存器返回struct和union函數(shù)值.對(duì)于較小的結(jié)構(gòu),它比 -fpcc-struct-return更有效率.
如果既沒(méi)有指定-fpcc-struct-return ,也沒(méi)有指定-freg-struct-return, GNU CC默認(rèn)使用目標(biāo)機(jī)的標(biāo)準(zhǔn)約定.如果沒(méi)有標(biāo)準(zhǔn)約定, GNU CC默認(rèn)采用-fpcc-struct-return.
- -fshort-enums
- 給enum類型只分配它聲明的值域范圍的字節(jié)數(shù).就是說(shuō), enum類型等于大小足夠的 最小整數(shù)類型.
- -fshort-double
- 使double類型的大小和float一樣.
- -fshared-data
- 要求編譯結(jié)果的數(shù)據(jù)和非const變量是共享數(shù)據(jù),而不是私有數(shù)據(jù).這種差別僅在某些操作系統(tǒng)上面有意義, 那里的共享數(shù)據(jù)在同一個(gè)程序的若干進(jìn)程間共享,而私有數(shù)據(jù)在每個(gè)進(jìn)程內(nèi)都有副件.
- -fno-common
- 即使未初始化的全局變量也分配在目標(biāo)文件的bss段,而不是把它們當(dāng)做普通塊(common block)建立.這樣的 結(jié)果是,如果在兩個(gè)不同的編譯結(jié)果中聲明了同一個(gè)變量(沒(méi)使用extern ),連接它們時(shí)會(huì)產(chǎn)生錯(cuò)誤. 這個(gè)選項(xiàng)可能有用的唯一情況是,你希望確認(rèn)程序能在其他系統(tǒng)上運(yùn)行,而其他系統(tǒng)總是這么做.
- -fno-ident
- 忽略`#ident'指令.
- -fno-gnu-linker
- 不要把全局初始化部件(如C++的構(gòu)造子和解構(gòu)子)輸出為GNU連接器使用的格式(在GNU連接器是標(biāo)準(zhǔn)方法的系統(tǒng) 上).當(dāng)你打算使用非GNU連接器的時(shí)候可以用這個(gè)選項(xiàng),非GNU連接器也需要collect2程序確保系統(tǒng)連接器 放入構(gòu)造子(constructor)和解構(gòu)子(destructor). (GNU CC的發(fā)布包中包含有collect2 程序.)對(duì)于必須使用collect2的系統(tǒng),編譯器驅(qū)動(dòng)程序gcc自動(dòng)配置為這么做.
- -finhibit-size-directive
- 不要輸出.size匯編指令,或其他類似指令,當(dāng)某個(gè)函數(shù)一分為二,兩部分在內(nèi)存中距離很遠(yuǎn)時(shí)會(huì)引起問(wèn)題. 當(dāng)編譯`crtstuff.c'時(shí)需要這個(gè)選項(xiàng);其他情況下都不應(yīng)該使用.
- -fverbose-asm
- 輸出匯編代碼時(shí)放些額外的注釋信息.這個(gè)選項(xiàng)僅用于確實(shí)需要閱讀匯編輸出的時(shí)候(可能調(diào)試編譯器自己的時(shí)候).
- -fvolatile
- 使編譯器認(rèn)為所有通過(guò)指針訪問(wèn)的內(nèi)存是易變內(nèi)存(volatile).
- -fvolatile-global
- 使編譯器認(rèn)為所有的外部和全局變量是易變內(nèi)存.
- -fpic
- 如果支持這種目標(biāo)機(jī),編譯器就生成位置無(wú)關(guān)目標(biāo)碼.適用于共享庫(kù)(shared library).
- -fPIC
- 如果支持這種目標(biāo)機(jī),編譯器就輸出位置無(wú)關(guān)目標(biāo)碼.適用于動(dòng)態(tài)連接(dynamic linking),即使分支需要大范圍 轉(zhuǎn)移.
- -ffixed-reg
- 把名為reg的寄存器按固定寄存器看待(fixed register);生成的目標(biāo)碼不應(yīng)該引用它(除了或許 用作棧指針,幀指針,或其他固定的角色).
reg必須是寄存器的名字.寄存器名字取決于機(jī)器,用機(jī)器描述宏文件的REGISTER_NAMES宏 定義.
這個(gè)選項(xiàng)沒(méi)有否定格式,因?yàn)樗谐鋈愤x擇.
- -fcall-used-reg
- 把名為reg的寄存器按可分配寄存器看待,不能在函數(shù)調(diào)用間使用.可以臨時(shí)使用或當(dāng)做變量使用,生存期 不超過(guò)一個(gè)函數(shù).這樣編譯的函數(shù)無(wú)需保存和恢復(fù)reg寄存器.
如果在可執(zhí)行模塊中,把這個(gè)選項(xiàng)說(shuō)明的寄存器用作固定角色將會(huì)產(chǎn)生災(zāi)難性結(jié)果,如棧指針或幀指針.
這個(gè)選項(xiàng)沒(méi)有否定格式,因?yàn)樗谐鋈愤x擇.
- -fcall-saved-reg
- 把名為reg的寄存器按函數(shù)保護(hù)的可分配寄存器看待.可以臨時(shí)使用或當(dāng)做變量使用,它甚至能在函數(shù)間 生存.這樣編譯的函數(shù)會(huì)保存和恢復(fù)使用中的reg寄存器.
如果在可執(zhí)行模塊中,把這個(gè)選項(xiàng)說(shuō)明的寄存器用作固定角色將會(huì)產(chǎn)生災(zāi)難性結(jié)果,如棧指針或幀指針.
另一種災(zāi)難是用這個(gè)選項(xiàng)說(shuō)明的寄存器返回函數(shù)值.
這個(gè)選項(xiàng)沒(méi)有否定格式,因?yàn)樗谐鋈愤x擇.
PRAGMAS
GNU C++支持兩條`#pragma'指令使同一個(gè)頭文件有兩個(gè)用途:對(duì)象類的接口定義, 對(duì)象類完整的內(nèi)容定義.
- #pragma interface
- (僅對(duì)C++)在定義對(duì)象類的頭文件中,使用這個(gè)指令可以節(jié)省大部分采用該類的目標(biāo)文件的大小.一般說(shuō)來(lái),某些信息 (內(nèi)嵌成員函數(shù)的備份副件,調(diào)試信息,實(shí)現(xiàn)虛函數(shù)的內(nèi)部表格等)的本地副件必須保存在包含類定義的各個(gè)目標(biāo)文件中.使用這個(gè) pragma指令能夠避免這樣的復(fù)制.當(dāng)編譯中引用包含`#pragma interface'指令的頭文件時(shí),就 不會(huì)產(chǎn)生這些輔助信息(除非輸入的主文件使用了`#pragma implementation'指令).作為替代,目標(biāo)文件 將包含可被連接時(shí)解析的引用(reference).
- #pragma implementation
-
- #pragma implementation "objects.h"
- (僅對(duì)C++)如果要求從頭文件產(chǎn)生完整的輸出(并且全局可見),你應(yīng)該在主輸入文件中使用這條pragma.頭文件 中應(yīng)該依次使用`#pragma interface'指令.在implementation文件中將產(chǎn)生全部?jī)?nèi)嵌成員函數(shù) 的備份,調(diào)試信息,實(shí)現(xiàn)虛函數(shù)的內(nèi)部表格等.
如果`#pragma implementation'不帶參數(shù),它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc'中, `#pragma implementation'等于`#pragma implementation allclass.h'.如果某個(gè)implementation文件需要從多個(gè)頭文件引入代碼,就應(yīng)該 使用這個(gè)字符串參數(shù).
不可能把一個(gè)頭文件里面的內(nèi)容分割到多個(gè)implementation文件中.
文件(FILE)
file.c C源文件
file.h C頭文件(預(yù)處理文件)
file.i 預(yù)處理后的C源文件
file.C C++源文件
file.cc C++源文件
file.cxx C++源文件
file.m Objective-C源文件
file.s 匯編語(yǔ)言文件
file.o 目標(biāo)文件
a.out 連接的輸出文件
TMPDIR/cc* 臨時(shí)文件
LIBDIR/cpp 預(yù)處理器
LIBDIR/cc1 C編譯器
LIBDIR/cc1plus C++編譯器
LIBDIR/collect 某些機(jī)器需要的連接器前端(front end)程序
LIBDIR/libgcc.a GCC子例程(subroutine)庫(kù)
/lib/crt[01n].o 啟動(dòng)例程(start-up)
LIBDIR/ccrt0 C++的附加啟動(dòng)例程
/lib/libc.a 標(biāo)準(zhǔn)C庫(kù),另見intro (3)
/usr/include #include文件的標(biāo)準(zhǔn)目錄
LIBDIR/include #include文件的標(biāo)準(zhǔn)gcc目錄
LIBDIR/g++-include #include文件的附加g++目錄
LIBDIR通常為/usr/local/lib/machine/version.
TMPDIR來(lái)自環(huán)境變量TMPDIR (如果存在,缺省為/usr/tmp ,否則為 /tmp).
BUGS
關(guān)于報(bào)告差錯(cuò)的指導(dǎo)請(qǐng)查閱GCC手冊(cè).
版權(quán)(COPYING)
Copyright 1991, 1992, 1993 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.
作者(AUTHORS)
關(guān)于GNU CC的奉獻(xiàn)者請(qǐng)查閱GUN CC手冊(cè).