歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> GCC 手冊(續完)

GCC 手冊(續完)

日期:2017/3/6 15:25:36   编辑:關於Unix
end 下面的`-m'選項用於 MI PS家族的計算機: -mcpu=cpu-type 生成指令的時候,假設默認的機器類型是cpu-type .默認情況下的cpu-type是 defa ult, G CC 將選取任何機型上都是最長周期時間的指令,這樣才能使代碼在所有的MIP S處理器上以合理 的速度運行. cpu-typ end

下面的`-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

Copyright © Linux教程網 All Rights Reserved