gcc使用手冊(4)(轉)

BSDLite發表於2007-08-11
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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-944415/,如需轉載,請註明出處,否則將追究法律責任。

相關文章