gcc使用手冊(4)(轉)
gcc使用手冊(4)(轉)[@more@]下面的`-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
-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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-944415/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- gcc使用手冊(2)(轉)GC
- gcc使用手冊(3)(轉)GC
- Linux使用手冊-vi使用手冊Linux
- TcpDump使用手冊TCP
- MyBatis 使用手冊MyBatis
- sqlmap使用手冊SQL
- Mybatis應用手冊MyBatis
- Tmux使用手冊UX
- Docker使用手冊Docker
- Promise使用手冊Promise
- Redis使用手冊Redis
- iptables 使用手冊
- DotProject 使用手冊Project
- Zabbix 使用手冊
- Windows系統網路工具使用手冊 (轉)Windows
- git 基本使用手冊Git
- Cobra框架使用手冊框架
- Memcached Client 使用手冊client
- jQuery使用手冊(收藏)jQuery
- 儀器使用手冊
- DENX U-Boot及Linux使用手冊(轉)bootLinux
- PerfDog WEB端使用手冊Web
- 【C#】CsvHelper 使用手冊C#
- Room Database完全使用手冊OOMDatabase
- MongoDB和pymongo自用手冊MongoDB
- Git 快速使用手冊(二)Git
- less語法實用手冊
- Linux iptables應用手冊Linux
- 《Redis 使用手冊》- 字串(PHP 版本)Redis字串PHP
- MySQL DBA 常用手冊小結MySql
- ThreadLocal 使用手冊 | 按需收藏thread
- Linux parallel 命令使用手冊LinuxParallel
- BeautifulSoup使用手冊(查詢篇)
- Kotlin 協程使用手冊Kotlin
- Gerrit和Jenkins使用手冊Jenkins
- MySQL DBA常用手冊小結MySql
- AutoMapper使用手冊(一)APP
- WebApiThrottle限流框架使用手冊WebAPI框架