GCC 中文手冊(下)
-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或 real-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'選項.
下面的`-m'選項用於MIPS家族的電腦:
-
-mcpu=
cpu-type
-
產生指令的時候,假設預設的機器類型是
cpu-type .預設情況下的
cpu-type是
default, GCC將選取任何機型上都是最長周期時間的指令,這樣才能使代碼在所有的MIPS處理器上以合理 的速度運行.
cpu-type的其他選擇是
r2000,
r3000,
r4000,和
r6000.雖然選定某個
cpu-type後, GCC將針對選定的晶片安排對應的工作,但是如果 不指定??
-mips2或
-mips3選項,編譯器不會輸出任何不符合MIPS ISA (instruction 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 ECOFF裡面.
-
-mgas
-
產生用於GNU彙編器的代碼.在OSF/1參考平台上這是預設選項,它使用OSF/rose目標格式.
-
-mrnames
-
-mno-rnames
-
-mrnames開關選項告訴輸出代碼使用MIPS軟體名稱說明寄存器,而不是硬體名稱(就是說,用
a0代替
$4). 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或
$28),的單字記憶體訪問指令而非普通的雙字指令.預設情況下, 用MIPS彙編器時
num是8,而GNU彙編器則為0.另外,
-G
num選項也被傳遞 給彙編器和連接器.所有的模組必須在相同的
-G
num值下編譯.
-
-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
-
產生的目標碼允許同一個源檔案中的函數調用,調用點和被調函數的距離可以超過256K之遠.不需要開啟這個開關選項, 除非連接器給出``branch out of range errors``這樣的錯誤.
-
-mdisable-fpregs
-
防止任何情況下使用浮點寄存器.編譯核心需要這個選項,核心切換浮點寄存器的執行環境速度非常緩慢.如果開啟了這個 開關選項同時試圖浮點操作,編譯將失敗.
-
-mdisable-indexing
-
防止編譯器使用索引地址模式(indexing address mode).這樣在MACH上編譯MIG產生的程式碼時,可以 避免一些非常晦澀的問題.
-
-mtrailing-colon
-
在標記定義(label definition)的末尾添加一個冒號(用於ELF彙編器).
下面的`-m'選項用於Intel 80960族電腦:
-
-m
cpu-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時,將使用 `
libgcc1.c'中的函數執行浮點運算.除非它們被模擬浮點操作的常式替換,或者類似,它們被編譯為調用 模擬常式,這些常式將發出浮點操作.如果你為不帶浮點操作的Alpha編譯器,你必須確保建立了這個庫,以便不調用 模擬常式.
注意,不帶浮點操作的Alpha也要求擁有浮點寄存器.
-
-mfp-reg
-
-mno-fp-regs
-
產生使用(或不使用)浮點寄存器群的目標代碼.
-mno-fp-regs包含有
-msoft-float 開關選項.如果不使用浮點寄存器,浮點運算元就象整數一樣通過整數寄存器傳送,浮點運算結果放到$0而不是$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-struct-return更有效率.
如果既沒有指定-fpcc-struct-return ,也沒有指定-freg-struct-return, GNU CC預設使用目標機的標準約定.如果沒有標準約定, GNU CC預設採用-fpcc-struct-return.
-
-fshort-enums
-
給
enum類型只分配它聲明的範圍範圍的位元組數.就是說,
enum類型等於大小足夠的 最小整數類型.
-
-fshort-double
-
使
double類型的大小和
float一樣.
-
-fshared-data
-
要求編譯結果的資料和非
const變數是共用資料,而不是私人資料.這種差別僅在某些作業系統上面有意義, 那裡的共用資料在同一個程式的若干進程間共用,而私人資料在每個進程內都有副件.
-
-fno-common
-
即使未初始化的全域變數也分配在目標檔案的bss段,而不是把它們當做普通塊(common block)建立.這樣的 結果是,如果在兩個不同的編譯結果中聲明了同一個變數(沒使用
extern ),串連它們時會產生錯誤. 這個選項可能有用的唯一情況是,你希望確認程式能在其他系統上運行,而其他系統總是這麼做.
-
-fno-ident
-
忽略`
#ident'指令.
-
-fno-gnu-linker
-
不要把全域初始化組件(如C++的構造子和解構子)輸出為GNU連接器使用的格式(在GNU連接器是標準方法的系統 上).當你打算使用非GNU連接器的時候可以用這個選項,非GNU連接器也需要
collect2程式確保系統連接器 放入構造子(constructor)和解構子(destructor). (GNU CC的發布包中包含有
collect2 程式.)對於
必須使用
collect2的系統,編譯器驅動程式
gcc自動設定為這麼做.
-
-finhibit-size-directive
-
不要輸出
.size彙編指令,或其他類似指令,當某個函數一分為二,兩部分在記憶體中距離很遠時會引起問題. 當編譯`
crtstuff.c'時需要這個選項;其他情況下都不應該使用.
-
-fverbose-asm
-
輸出彙編代碼時放些額外的注釋資訊.這個選項僅用於確實需要閱讀彙編輸出的時候(可能調試編譯器自己的時候).
-
-fvolatile
-
使編譯器認為所有通過指標訪問的記憶體是易變記憶體(volatile).
-
-fvolatile-global
-
使編譯器認為所有的外部和全域變數是易變記憶體.
-
-fpic
-
如果支援這種目標機,編譯器就產生位置無關目標碼.適用於共用庫(shared library).
-
-fPIC
-
如果支援這種目標機,編譯器就輸出位置無關目標碼.適用於動態串連(dynamic linking),即使分支需要大範圍 轉移.
-
-ffixed-
reg
-
把名為
reg的寄存器按固定寄存器看待(fixed register);產生的目標碼不應該引用它(除了或許 用作棧指標,幀指標,或其他固定的角色).
reg必須是寄存器的名字.寄存器名字取決於機器,用機器描述宏檔案的REGISTER_NAMES宏 定義.
這個選項沒有否定格式,因為它列出三路選擇.
-
-fcall-used-
reg
-
把名為
reg的寄存器按可分配寄存器看待,不能在函數調用間使用.可以臨時使用或當做變數使用,生存期 不超過一個函數.這樣編譯的函數無需儲存和恢複
reg寄存器.
如果在可執行模組中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指標或幀指標.
這個選項沒有否定格式,因為它列出三路選擇.
-
-fcall-saved-
reg
-
把名為
reg的寄存器按函數保護的可分配寄存器看待.可以臨時使用或當做變數使用,它甚至能在函數間 生存.這樣編譯的函數會儲存和恢複使用中的
reg寄存器.
如果在可執行模組中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指標或幀指標.
另一種災難是用這個選項說明的寄存器返回函數值.
這個選項沒有否定格式,因為它列出三路選擇.
PRAGMAS
GNU C++支援兩條`#pragma'指令使同一個標頭檔有兩個用途:對象類的介面定義, 對象類完整的內容定義.
-
#pragma interface
-
(僅對C++)在定義對象類的標頭檔中,使用這個指令可以節省大部分採用該類的目標檔案的大小.一般說來,某些資訊 (內嵌成員函數的備份副件,調試資訊,實現虛函數的內部表格等)的本地副件必須儲存在包含類定義的各個目標檔案中.使用這個 pragma指令能夠避免這樣的複製.當編譯中引用包含`
#pragma interface'指令的標頭檔時,就 不會產生這些輔助資訊(除非輸入的主檔案使用了`
#pragma implementation'指令).作為替代,目標檔案 將包含可被串連時解析的引用(reference).
-
#pragma implementation
-
#pragma implementation "
objects
.h"
-
(僅對C++)如果要求從標頭檔產生完整的輸出(並且全域可見),你應該在主輸入檔案中使用這條pragma.標頭檔 中應該依次使用`
#pragma interface'指令.在implementation檔案中將產生全部內嵌成員函數 的備份,調試資訊,實現虛函數的內部表格等.
如果`#pragma implementation'不帶參數,它指的是和源檔案有相同基本名的包含檔案;例如, `allclass.cc'中, `#pragma implementation'等於`#pragma implementation 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 某些機器需要的連接器前端(front end)程式LIBDIR/libgcc.a GCC子常式(subroutine)庫/lib/crt[01n].o 啟動常式(start-up)LIBDIR/ccrt0 C++的附加啟動常式/lib/libc.a 標準C庫,另見intro (3)/usr/include #include檔案的標準目錄LIBDIR/include #include檔案的標準gcc目錄LIBDIR/g++-include #include檔案的附加g++目錄
LIBDIR通常為/usr/local/lib/machine/version.
TMPDIR來自環境變數TMPDIR (如果存在,預設為/usr/tmp ,否則為 /tmp).
另見(SEE ALSO)
cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
info中 `gcc', `cpp', `as', `ld',和`gdb'的條目.
Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman和Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain和Roland Pesch.
BUGS
關於報告差錯的指導請查閱GCC手冊.
著作權(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)
關於GNU CC的奉獻者請查閱GUN CC手冊.
[中文版維護人]
徐明<xuming@users.sourceforge.net>
[中文版最新更新]
2003/05/13第一版
《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net/
Index
-
NAME
-
總覽 (SYNOPSIS)
-
警告 (WARNING)
-
描述 (DESCRIPTION)
-
選項 (OPTIONS)
-
總體選項 (Overall Option)