當前位置:首頁 > 單片機
[導讀] msvr3打開(`-msvr4')或關閉(`-msvr3')和SystemV第四版(SVr4)相關的編譯器擴展.效果如下:*輸出哪種匯編語法(你可以使用`-mversion-03.00'選項單獨選擇).* `-msvr4'使C預處理器識別`#pra

msvr3
打開(`-msvr4')或關閉(`-msvr3')和SystemV第四版(SVr4)相關的編譯器擴展.效果如下:
*
輸出哪種匯編語法(你可以使用`-mversion-03.00'選項單獨選擇).
*

`-msvr4'使C預處理器識別`#pragmaweak'指令
*
`-msvr4'使GCC輸出額外的聲明指令(declarationdirective),用于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不會發出警告.

下面的選項用于IBMRS6000:

-MFP-in-toc

-mno-FP-in-toc
控制是否把浮點常量放到內容表(TOC)中,內容表存放所有的全局變量和函數地址.默認情況下,GCC把浮點常量放到這里;如果TOC溢出,`-mno-fp-in-toc'選項能夠減少TOC的大小,這樣就可以避免溢出.

下面的`-m'選項用于IBMRTPC:

-min-line-mul
對于整數乘法使用嵌入代碼.這是默認選項.
-mcall-lib-mul
對于整數乘法使用lmul$$.
-mfull-fp-bLOCks
生成全尺寸浮點數據塊,包括IBM建議的最少數量的活動空間(scratchsPACe).這是默認選項.
-mminimum-fp-blocks
不要在浮點數據塊中包括額外的活動空間.這樣就產生較小但是略慢的可執行程序,因為活動空間必須動態分配.
-mfp-arg-in-fpregs
采用不兼容IBM調用約定的調用序列,通過浮點寄存器傳送浮點參數.注意,如果指定了這個選項,varargs.h和stdargs.h將無法支持浮點單元.

-mfp-arg-in-gregs
使用正常的調用約定處理浮點參數.這是默認選項.

-mhc-struct-return
通過內存返回大于一個字的結構,而不是通過寄存器.用于兼容MetaWareHighC(hc)編譯器.使用`-fpcc-struct-return'選項可以兼容PortableC編譯器(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選項,編譯器不會輸出任何不符合MIPSISA(instructionsetarchitecture)一級的代碼.

-mips2
輸出MIPSISA二級指令(可能的擴展,如平方根指令).-mcpu=r4000或-mcpu=r6000選項必須和-mips2聯用.

-mips3
輸出MIPSISA三級指令(64位指令).-mcpu=r4000選項必須和-mips2聯用.(譯注:疑為-mips3)

-mint64
-mlong64
-mlonglong128
這些選項目前不起作用.

-mmips-as
產生用于MIPS匯編器的代碼,同時使用mips-tfile添加普通的調試信息.對于大多數平臺這是默認選項,除了OSF/1參考平臺,它使用 OSF/rose目標格式.如果打開了任一個-ggdb,-gstabs,或-gstabs+選項開關,mips-tfile程序就把stab封裝在 MIPSECOFF里面.

-mgas
產生用于GNU匯編器的代碼.在OSF/1參考平臺上這是默認選項,它使用OSF/rose目標格式.

-mrnames
-mno-rnames
-mrnames開關選項告訴輸出代碼使用MIPS軟件名稱說明寄存器,而不是硬件名稱(就是說,用a0代替$4).GNU匯編器不支持-mrnames選項,而MIPS匯編器則運行MIPSC預處理器處理源文件.-mno-rnames是默認選項.

-mgpopt
-mno-gpopt
-mgpopt開關選項要求在正文段中把所有的數據聲明寫到指令前面,使各種MIPS匯編器對短類型全局或靜態數據項(shortglobalorstatICdataitEMS)輸出單字內存訪問而不是雙字內存訪問.當打開編譯優化時,這是默認功能.


-mstats
-mno-stats
每次處理完非嵌入函數(non-inlinefunction)后,-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
輸出包含浮點庫調用.警告:所需庫不是GNUCC的一部分.一般說來使用該機型本地C編譯器的相應部件,但是不能直接用于交叉編譯,你必須自己安排,提供交叉編譯適用的庫函數.

-mhard-float
輸出包含浮點指令.如果編譯器沒有被改動,這就是默認選項.

-mfp64
編譯器認為狀態字的FR置位(on),也就是說存在3264-bit浮點寄存器,而不是3232-bit浮點寄存器.同時必須打開-mcpu=r4000和-mips3開關.

-mfp32
認為存在3232-bit浮點寄存器.這是默認選項.

-mabicalls

-mno-abicalls
輸出(或不輸出).abicalls,.cpload,和.cprestore偽指令,某些SystemV.4版本用于位置無關代碼.

-mhalf-pic
-mno-half-pic
-mhalf-pic開關選項要求把外部引用的指針放到數據段,并且載入內存,而不放到正文段.該選項目前不起作用.

-Gnum
把小于等于num字節的全局或靜態數據放到小的數據段或bss段,而不是普通的數據段或bss段.這樣匯編器可以輸出基于全局指針(gp或$28),的單字內存訪問指令而非普通的雙字指令.默認情況下,用MIPS匯編器時num是8,而GNU匯編器則為0.另外,-Gnum選項也被傳遞給匯編器和連接器.所有的模塊必須在相同的-Gnum值下編譯.

-nocpp
匯編用戶匯編文件(帶有`.s'后綴)時,告訴MIPS匯編器不要運行預處理器.

下面的`-m'選項用于Intel80386族計算機:-m486

-mno-486
控制是否生成對486優化的代碼.

-msoft-float
輸出包含浮點庫調用.警告:所需庫不是GNUCC的一部分.一般說來使用該機型本地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
生成PA1.0處理器的目標碼.
-mpa-risc-1-1
生成PA1.1處理器的目標碼.

-mkernel
生成適用于內核的目標碼.特別要避免add指令,它有一個參數是DP寄存器;用adDIL代替add指令.這樣可以避免HP-UX連接器的某個嚴重bug.

-mshared-libs
生成能夠連接HP-UX共享庫的目標碼.該選項還沒有實現全部功能,對PA目標默認為關閉.使用這個選項會導致編譯器生成錯誤的目標碼.

-mno-shared-libs
不生成連接HP-UX共享庫的目標碼.這是PA目標的默認選項.

-mlong-calls
生成的目標碼允許同一個源文件中的函數調用,調用點和被調函數的距離可以超過256K之遠.不需要打開這個開關選項,除非連接器給出``branchoutofrangeerrors``這樣的錯誤.

-mdisable-fpregs
防止任何情況下使用浮點寄存器.編譯內核需要這個選項,內核切換浮點寄存器的執行環境速度非常緩慢.如果打開了這個開關選項同時試圖浮點操作,編譯將失敗.

-mdisable-indexing
防止編譯器使用索引地址模式(indexingaddressmode).這樣在MACH上編譯MIG生成的代碼時,可以避免一些非常晦澀的問題.

-mtrailing-colon
在標記定義(labeldefinition)的末尾添加一個冒號(用于ELF匯編器).

下面的`-m'選項用于Intel80960族計算機:

-mcpu-type
默認機器類型為cpu-type,使編譯器產生對應的指令,地址模式和內存對齊.默認的cpu-type是kb;其他選擇有ka,mc,ca,cf,sa,和sb.

-mnumerics
-msoft-float
-mnumerics開關選項指出處理器不支持浮點指令.-msoft-float開關選項指出不應該認為機器支持浮點操作.

-mleaf-procedures
-mno-leaf-procedures
企圖(或防止)改變葉過程(leafprocedure),使其可被bal指令以及call指令調用.對于直接函數調用,如果bal指令能夠被匯編器或連接器替換,這可以產生更有效的代碼,但是其他情況下產生較低效的代碼,例如通過函數指針調用函數,或使用了不支持這種優化的連接器.

-mtail-call
-mno-tail-call
執行(或不執行)更多的嘗試(除過編譯器那些機器無關部分),優化進入分支的尾遞歸(tail-recursive)調用.你可能不需要這個,因為檢測什么地方無效沒有全部完成.默認開關是-mno-tail-call.

-mcomplex-addr
-mno-complex-addr
認為(或不認為)在當前的i960設備上,值得使用復合地址模式(complexaddressingmode).復合地址模式可能不值得用到K系列,但是一定值得用在C系列.目前除了CB和CC處理器,其他處理器上-mcomplex-addr是默認選項.

-mcode-align
-mno-code-align
把目標碼對齊到8字節邊界上(或者不必),這樣讀取會快一些.目前只對C系列默認打開.

-mic-compat
-mic2.0-compat
-mic3.0-compat
兼容iC960v2.0或v3.0.

-masm-compat
-mintel-asm
兼容iC960匯編器.

-mstrict-align
-mno-strict-align
不允許(或允許)邊界不對齊的訪問.

-mold-align
使結構對齊(structure-alignment)兼容Intel的gcc發行版本1.3(基于gcc1.37).目前這個選項有點問題,因為#pragmaalign1總是作同樣的設定,而且無法關掉.

下面的`-m'選項用于DECAlpha設備:

-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開關編譯過的目標碼調用,它也必須用這個選項編譯.
這個選項的典型用法是建立內核,內核不使用任何浮點寄存器,因此沒必要保存和恢復這些寄存器.


下面附加的選項出現在SystemV第四版中,用于兼容這些系統中的其他編譯器:

-G
在SVr4系統中,gcc出于兼容接受了`-G'選項(然后傳遞給連接器).可是我們建議使用`-symbolic'或`-shared'選項,而不在gcc命令行上出現連接選項.

-Qy
驗證編譯器用的工具的版本,輸出到.ident匯編指令.

-Qn
制止輸出端的.ident指令(默認選項).

-YP,dirs
對于`-l'指定的庫文件,只搜索dirs.你可以在dirs中用冒號隔開各個目錄項.

-Ym,dir
在dir目錄中尋找M4預處理器.匯編器使用這個選項.


代碼生成選項(CODEGENERATIONOPTION)
下面的選項和平臺無關,用于控制目標碼生成的接口約定.
大部分選項以`-f'開始.這些選項擁有確定和否定兩種格式;`-ffoo'的否定格式是`-fno-foo'.后面的描述將只列舉其中的一個格式---非默認的格式.你可以通過添加或去掉`no-'推測出另一個格式.


-fnonnull-objects
假設通過引用(reference)取得的對象不為null(僅C++).
一般說來,GNUC++對通過引用取得的對象作保守假設.例如,編譯器一定會檢查下似代碼中的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,GNUCC默認使用目標機的標準約定.如果沒有標準約定,GNUCC默認采用-fpcc-struct-return.


-fshort-enums
給enum類型只分配它聲明的值域范圍的字節數.就是說,enum類型等于大小足夠的最小整數類型.

-fshort-double
使double類型的大小和float一樣.

-fshared-data
要求編譯結果的數據和非const變量是共享數據,而不是私有數據.這種差別僅在某些操作系統上面有意義,那里的共享數據在同一個程序的若干進程間共享,而私有數據在每個進程內都有副件.

-fno-common
即使未初始化的全局變量也分配在目標文件的bss段,而不是把它們當做普通塊(commonblock)建立.這樣的結果是,如果在兩個不同的編譯結果中聲明了同一個變量(沒使用extern),連接它們時會產生錯誤.這個選項可能有用的唯一情況是,你希望確認程序能在其他系統上運行,而其他系統總是這么做.

-fno-ident
忽略`#ident'指令.

-fno-gnu-linker
不要把全局初始化部件(如C++的構造子和解構子)輸出為GNU連接器使用的格式(在GNU連接器是標準方法的系統上).當你打算使用非GNU連接器的時候可以用這個選項,非GNU連接器也需要collect2程序確保系統連接器放入構造子(constructor)和解構子(destructor). (GNUCC的發布包中包含有collect2程序.)對于必須使用collect2的系統,編譯器驅動程序gcc自動配置為這么做.

-finhibit-size-directive
不要輸出.size匯編指令,或其他類似指令,當某個函數一分為二,兩部分在內存中距離很遠時會引起問題.當編譯`crtstuff.c'時需要這個選項;其他情況下都不應該使用.

-fverbose-asm
輸出匯編代碼時放些額外的注釋信息.這個選項僅用于確實需要閱讀匯編輸出的時候(可能調試編譯器自己的時候).

-fvolatile
使編譯器認為所有通過指針訪問的內存是易變內存(volatile).

-fvolatile-global
使編譯器認為所有的外部和全局變量是易變內存.

-fpic
如果支持這種目標機,編譯器就生成位置無關目標碼.適用于共享庫(sharedlibrary).

-fPIC
如果支持這種目標機,編譯器就輸出位置無關目標碼.適用于動態連接(dynamiclinking),即使分支需要大范圍轉移.

-ffixed-reg
把名為reg的寄存器按固定寄存器看待(fixedregister);生成的目標碼不應該引用它(除了或許用作棧指針,幀指針,或其他固定的角色).
reg必須是寄存器的名字.寄存器名字取決于機器,用機器描述宏文件的REGISTER_NAMES宏定義.

這個選項沒有否定格式,因為它列出三路選擇.


-fcall-used-reg
把名為reg的寄存器按可分配寄存器看待,不能在函數調用間使用.可以臨時使用或當做變量使用,生存期不超過一個函數.這樣編譯的函數無需保存和恢復reg寄存器.
如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指針或幀指針.

這個選項沒有否定格式,因為它列出三路選擇.


-fcall-saved-reg
把名為reg的寄存器按函數保護的可分配寄存器看待.可以臨時使用或當做變量使用,它甚至能在函數間生存.這樣編譯的函數會保存和恢復使用中的reg寄存器.
如果在可執行模塊中,把這個選項說明的寄存器用作固定角色將會產生災難性結果,如棧指針或幀指針.

另一種災難是用這個選項說明的寄存器返回函數值.

這個選項沒有否定格式,因為它列出三路選擇.



PRAGMAS
GNUC++支持兩條`#pragma'指令使同一個頭文件有兩個用途:對象類的接口定義,對象類完整的內容定義.

#pragmainterface
(僅對C++)在定義對象類的頭文件中,使用這個指令可以節省大部分采用該類的目標文件的大小.一般說來,某些信息(內嵌成員函數的備份副件,調試信息,實現虛函數的內部表格等)的本地副件必須保存在包含類定義的各個目標文件中.使用這個pragma指令能夠避免這樣的復制.當編譯中引用包含 `#pragmainterface'指令的頭文件時,就不會產生這些輔助信息(除非輸入的主文件使用了 `#pragmaimplementation'指令).作為替代,目標文件將包含可被連接時解析的引用(reference).

#pragmaimplementation
#pragmaimplementation"objects.h"
(僅對C++)如果要求從頭文件產生完整的輸出(并且全局可見),你應該在主輸入文件中使用這條pragma.頭文件中應該依次使用 `#pragmainterface'指令.在implementation文件中將產生全部內嵌成員函數的備份,調試信息,實現虛函數的內部表格等.
如果`#pragmaimplementation'不帶參數,它指的是和源文件有相同基本名的包含文件;例如, `allclass.cc'中,`#pragmaimplementation'等于 `#pragmaimplementationallclass.h'.如果某個implementation文件需要從多個頭文件引入代碼,就應該 使用這個字符串參數.

不可能把一個頭文件里面的內容分割到多個implementation文件中.



文件(FILE)
file.cC源文件
file.hC頭文件(預處理文件)
file.i預處理后的C源文件
file.CC++源文件
file.ccC++源文件
file.cxxC++源文件
file.mObjective-C源文件
file.s匯編語言文件
file.o目標文件
a.out連接的輸出文件
TMPDIR/cc*臨時文件
LIBDIR/cpp預處理器
LIBDIR/cc1C編譯器
LIBDIR/cc1plusC++編譯器
LIBDIR/collect某些機器需要的連接器前端(frontend)程序
LIBDIR/libgcc.aGCC子例程(subroutine)庫
/lib/crt[01n].o啟動例程(start-up)
LIBDIR/ccrt0C++的附加啟動例程
/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).

另見(SEEALSO)
cpp(1),as(1),ld(1),gdb(1),adb(1),dbx(1),sdb(1).
info中`gcc',`cpp',`as',`ld',和`gdb'的條目.
UsingandPortingGNUCC (forversion2.0),RichardM.Stallman;TheCPreprocessor,RichardM.Stallman; DebuggingwithGDB:theGNUSource-LevelDebugger,RichardM.Stallman和 RolandH.Pesch;Usingas:theGNUAssembler,DeanElsner,JayFenlason& friends;ld:theGNUlinker,SteveChamberlain和RolandPesch.

BUGS
關于報告差錯的指導請查閱GCC手冊.

版權(COPYING)
Copyright1991,1992,1993FreeSoftwareFoundation,Inc.
Permissionisgrantedtomakeanddistributeverbatimcopiesofthismanualprovidedthecopyrightnoticeandthispermissionnoticearepreservedonallcopies.

Permissionisgrantedtocopyanddistributemodifiedversionsofthismanualundertheconditionsforverbatimcopying,providedthattheentireresultingderivedworkisdistributedunderthetermsofapermissionnoticeidenticaltothisone.

Permissionisgrantedtocopyanddistributetranslationsofthismanualintoanotherlanguage,undertheaboveconditionsformodifiedversions,exceptthatthispermissionnoticemaybeincludedintranslationsapprovedbytheFreeSoftwareFoundationinsteadofintheoriginalEnglish.

單片機

20164 篇文章

關注

發布文章

技術子站

新时时彩
牛客栈策略 丛林快讯 情趣内衣 sm捆绑套装 老时时彩 谁有上海哈灵麻将群 石家庄按摩店全身按摩 天津快乐10分钟开奖结果 日韩毛片AV无码免费 日本av女优pk黑人 灰熊vs火箭战绩 淘宝快3 三级片下载到快播 股票分析师排名 陕西麻将技巧必胜 腾讯证券开户 体彩排五走势图带连线