GCC编译选项速查手册

 

Gcc编译选项速查手册

"-fno-builtin
-fno-builtin-function"	不接受没有 __builtin_ 前缀的函数作为内建函数。
 -mapcs-frame              	对所有函数都生成一个遵从ARM程序调用标准的堆栈帧,即使在正确执行代码无需严格这么做时。使用此开关时指定“-fomit-frame-pointer”将不产生叶函数的堆栈帧。缺省情况下是“-mno-apcs-frame”。
 -mapcs                    	与“-mapcs-frame”相同。
 -mapcs-26                	产生使用26比特程序计数器的处理器代码,遵从APCS 26比特选项的函数调用标准。此开关替代了编译器早期版本中的“-m2”和“-m3”开关。
 -mapcs-32                 	产生使用32比特程序计数器的处理器代码,遵从APCS 32比特选项的函数调用标准。此开关替代了编译器早期版本中的“-m6”。
 -mapcs-stack-check        	产生检查每个函数入口可用的堆栈空间大小(实际使用了一些堆栈空间)。如果可用空间不足,将按照所需堆栈空间大小调用函数“__rt_stkovf_split_small”或者“__rt_stkovf_split_big”。运行时的系统需要提供这些函数。缺省情况下是“-mno-apcs-stack-check”,因为这样产生的代码较小。
 -mapcs-float              	使用浮点寄存器传递浮点参数。这是APCS的一个变种。如果目标硬件存在浮点单元,或者代码将执行较多的浮点计算,推荐使用此开关。缺省情况下是“-mno-apcs-float”,因为使用开关“-mapcs-float”将导致只有整数的代码大小稍有增加。
 -mapcs-reentrant          	产生可重入的位置独立代码。等价于“-fpic”开关。缺省情况下是“-mno-apcs-reentrant”。
 -mthumb-interwork         	产生支持ARM和THUMB指令集间调用的代码。不使用此开关,在一个程序里就不能可靠地使用两个指令集。缺省情况下是“-mno-thumb-interwork”,因为指定了“-mthumb-interwork”产生的代码稍微大一些。
 -mno-sched-prolog         	禁止对函数prolog里的指令重新排序,或者把这些指令与函数体里的指令进行合并。这就意味着所有函数都以一组可识别的指令开始(实际上是一小组不同函数开端中的一个),如果函数处于可执行代码段中,可以使用此信息定位函数的起始位置。缺省情况下是“-msched-prolog”。
 -mhard-float              	产生包含浮点指令的输出。这是缺省情况。
 -msoft-float              	产生包含浮点库调用的输出。注意:所需的库不是所有ARM目标机都提供的。一般使用机器惯用的C编译器的配置,但在交叉编译时无法直接获得,必须进行一些整理为交叉编译提供合适的库函数。“-msoft-float”改变了输出文件的调用规范,所以只有程序的所有部分都使用此开关编译才起作用。特别是需要使用“-msoft-float”开关编译与GNU CC一起获得的“libgcc.a”库才行。
 -mlittle-endian           	产生运行在little-endian模式下的处理器代码。这是所有标准配置的缺省情况。
 -mbig-endian              	产生运行在big-endian模式下的处理器代码;缺省情况是产生运行在little-endian模式下的处理器代码。
 -mwords-little-endian     	此开关只用于为big endian处理器产生代码。产生字序为little-endian但字节顺序为big-endian的代码。也就是说,字节顺序为“32107654”格式。注意:只有在要求与2.8之前版本编译器产生的big-endian ARM处理器代码兼容时才用到此开关。
 -mshort-load-bytes        	不试图通过从一个没有边界对齐的地址载入一个字的方式载入半个字(如“short”)。某些目标机的MMU被配置成用陷阱捕获没有边界对齐的载入;使用此开关产生的代码在这些环境下是安全的。
 -mno-short-load-bytes     	使用没有边界对齐的字载入半个字(如“short”)。此开关产生的代码效率较高,但MMU有时被配置成用陷阱捕获这些指令。
 -mshort-load-words        	与“-mno-short-load-bytes”相同。
 -mno-short-load-words     	与“-mshort-load-bytes”相同。
 -mbsd                     	此开关只用于RISC iX。仿真原始的BSD模式编译器。这是没有指定“-ansi”时的缺省情况。
 -mxopen                   	此开关只用于RISC iX。仿真原始的X
 -mno-symrename            	此开关只用于RISC iX。不要在代码汇编后运行汇编程序随后的处理程序“symrename”。一般在准备与RISC iX C库连接时需要修改某些标准符号,此开关忽略这一过程。为交叉编译构建的编译器不运行汇编程序随后的处理程序。
 -mcpu=                    	此开关指定目标ARM处理器的名称。GCC使用这个名称来确定产生汇编代码时可用的指令类型。可用的名称是: arm2、arm250、arm3、arm6、arm60、arm600、arm610、arm620、arm7、arm7m、arm7d、arm7dm、arm7di、arm7dmi、arm70、arm700、arm700i、arm710、arm710c、arm7100、arm7500、arm7500fe、arm7tdmi、arm8、strongarm和strongarm110。
 -march=                   	此开关指定目标机ARM结构的名称。GCC使用这个名称来确定产生汇编代码时可用的指令类型。此开关可以同“-mcpu=”开关结合使用,也可以替代“-mcpu=”开关。可用的名称是:armv2、armv2a、armv3、armv3m、armv4和armv4t。
 -mfpe=                    	此开关指定了目标机可用的浮点仿真版本。可用值为2和3。
 -mstructure-size-boundary=	所有结构和联合的大小都处理成此开关设置比特数的倍数。可用值为8和32。不同的工具套件所使用的缺省值不同。对于COFF目标机使用的工具套件缺省值为8。指定较大的数字可以产生速度较快、效率较高的代码,但同时会增加程序的大小。若使用结构或联合交换信息,则使用某个值编译的代码可能不可以与使用另一个值编译的代码或库共同使用。鼓励程序员使用值32,因为工具套件未来版本可能会缺省使用值32。
 Thumb开关                 	
 -mthumb-interwork         	产生支持THUMB和ARM指令集间调用的代码。不使用此开关,在一个程序里就不能可靠地使用两个指令集。缺省情况下是“-mno-thumb-interwork”,因为使用“-mthumb-interwork”开关产生的代码稍微大一些。
 -mtpcs-frame              	对所有非叶函数都生成一个遵从Thumb程序调用标准的堆栈帧。(叶函数是不调用任何其它函数的函数)。缺省情况下是“-mno-apcs-frame”。
 -mtpcs-leaf-frame         	对所有叶函数都生成一个遵从Thumb程序调用标准的堆栈帧。(叶函数是不调用任何其它函数的函数)。缺省情况下是“-mno-apcs-leaf-frame”。 
 -mlittle-endian           	产生运行在little-endian模式下的处理器代码。这是所有标准配置的缺省情况。
 -mbig-endian              	产生运行在big-endian模式下的处理器代码。
 -mstructure-size-boundary=	所有结构和联合的大小都处理成此开关设置比特数的倍数。可用值为8和32。不同的工具套件所使用的缺省值不同。对于COFF目标机使用的工具套件缺省值为8。指定较大的数字可以产生速度较快、效率较高的代码,但同时会增加程序的大小。这两个值可能不兼容。若使用结构或联合交换信息,则使用某个值编译的代码可能不可以与使用另一个值编译的代码或库共同使用。鼓励程序员使用值32,因为工具套件未来版本可能会缺省使用值32。
" -fno-omit-frame-pointer
-fomit-frame-pointer"	"Don’t store the frame pointer in a register for functions that don’t need one, 
thus omitting the code to store and retrieve the address as well as making another register available for general use. 
This flag is automatically set for all levels of -O optimization, but only if the debugger can be run without a frame pointer. 
If the debugger cannot be run with this setting you will have to set it explicitly. Some platforms have no frame pointer and t
his flag will have no effect. The default is -fno-omit-frame-pointer.
 
通常在GCC编译器Debug模式下,r11寄存器用作fp帧指针,实现栈回溯功能。通常GCC编译器Release模式下,为了追求效率,
r11寄存器用作局部变量寄存器,栈回溯功能失效。GCC编译器中,编译选项-fno-omit-frame-pointer 用于强制将r11寄存器用作fp,实现栈回溯功能;
软件的Release版一般默认优化选项为-O2,编译器便打开了选项-fomit-frame-pointer,该编译选项用于将r11寄存器用于局部变量寄存器,忽略其帧指针功能,
这时栈回溯功能失效。因此如果是Release模式,仍然希望使用栈回溯功能,可以使用编译选项-fno-omit-frame-pointer。"
-l library	进行链接时搜索名为library的库。
-llibrary	例子: $ gcc test.c -lm -o test
-Idir	把dir加入到搜索头文件的路径列表中。
	例子: $ gcc test.c -I../inc -o test
-Ldir	把dir加入到搜索库文件的路径列表中。
	例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test
-Dname	预定义一个名为name的宏,值为1。
	例子: $ gcc -DTEST_CONFIG test.c -o test
-Dname=definition	预定义名为name,值为definition的宏。
-ggdb 	为调试器 gdb 生成调试信息。level可以为1,2,3,默认值为2。
-ggdblevel	
-g 	生成操作系统本地格式的调试信息。-g 和 -ggdb 并不太相同, -g 会生成 gdb 之外的信息。level取值同上。
-glevel	
-s	去除可执行文件中的符号表和重定位信息。用于减小可执行文件的大小。
-M	告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出 一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件。生成的规则可以是单行,但如果太长,就用`\'-换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。
-C	告诉预处理器不要丢弃注释。配合`-E'选项使用。
-P	告诉预处理器不要产生`#line'命令。配合`-E'选项使用。
-static	在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上无效。
-nostdlib	不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
Warnings	
-Wall	会打开一些很有用的警告选项,建议编译时加此选项。
-W 	打印一些额外的警告信息。
-Wextra	
-w	禁止显示所有警告信息。
-Wshadow	当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。很有用的选项,建议打开。 -Wall 并不会打开此项。
-Wpointer-arith	对函数指针或者void *类型的指针进行算术操作时给出警告。也很有用。 -Wall 并不会打开此项。
-Wcast-qual	当强制转化丢掉了类型修饰符时给出警告。 -Wall 并不会打开此项。
-Waggregate-return	如果定义或调用了返回结构体或联合体的函数,编译器就发出警告。
-Winline	无论是声明为 inline 或者是指定了-finline-functions 选项,如果某函数不能内联,编译器都将发出警告。如果你的代码含有很多 inline 函数的话,这是很有用的选项。
-Werror	把警告当作错误。出现任何警告就放弃编译。
-Wunreachable-code	如果编译器探测到永远不会执行到的代码,就给出警告。也是比较有用的选项。
-Wcast-align	一旦某个指针类型强制转换导致目标所需的地址对齐增加时,编译器就发出警告。
-Wundef	当一个没有定义的符号出现在 #if 中时,给出警告。
-Wredundant-decls	如果在同一个可见域内某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别。
Optimization	
-O0	禁止编译器进行优化。默认为此项。
-O 	尝试优化编译时间和可执行文件大小。
0	
0	更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法。
0	在 -O2 的基础上再打开一些优化选项:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-Os	对生成文件大小进行优化。它会打开 -O2 开的全部选项,除了会那些增加文件大小的。
-finline-functions	把所有简单的函数内联进调用者。编译器会探索式地决定哪些函数足够简单,值得做这种内联。
-fstrict-aliasing	施加最强的别名规则(aliasing rules)。
Standard	
-ansi	支持符合ANSI标准的C程序。这样就会关闭GNU C中某些不兼容ANSI C的特性。
-std=c89 	指明使用标准 ISO C90 作为标准来编译程序。
-iso9899:1990	
-std=c99 	指明使用标准 ISO C99 作为标准来编译程序。
-std=iso9899:1999	
-std=c++98	指明使用标准 C++98 作为标准来编译程序。
-std=gnu9x 	使用 ISO C99 再加上 GNU 的一些扩展。
-std=gnu99	
-fno-asm	不把asm, inline或typeof当作关键字,因此这些词可以用做标识符。用 __asm__, __inline__和__typeof__能够替代它们。 `-ansi' 隐含声明了`-fno-asm'。
-fgnu89-inline	告诉编译器在 C99 模式下看到 inline 函数时使用传统的 GNU 句法。
C options	
-fsigned-char 	把char定义为有/无符号类型,如同signed char/unsigned char。
-funsigned-char	
-traditional	尝试支持传统C编译器的某些方面。详见GNU C手册。
-fno-builtin 	不接受没有 __builtin_ 前缀的函数作为内建函数。
-fno-builtin-function	
-trigraphs	支持ANSI C的三联符( trigraphs)。`-ansi'选项隐含声明了此选项。
-fsigned-bitfields 	如果没有明确声明`signed'或`unsigned'修饰符,这些选项用来定义有符号位域或无符号位域。缺省情况下,位域是有符号的,因为它们继承的基本整数类型,如int,是有符号数。
-funsigned-bitfields	
-Wstrict-prototypes	如果函数的声明或定义没有指出参数类型,编译器就发出警告。很有用的警告。
-Wmissing-prototypes	如果没有预先声明就定义了全局函数,编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这个选项 的目的是检查没有在头文件中声明的全局函数。
-Wnested-externs	如果某extern声明出现在函数内部,编译器就发出警告。
C++ options	
-ffor-scope	从头开始执行程序,也允许进行重定向。
-fno-rtti	关闭对 dynamic_cast 和 typeid 的支持。如果你不需要这些功能,关闭它会节省一些空间。
-Wctor-dtor-privacy	当一个类没有用时给出警告。因为构造函数和析构函数会被当作私有的。
-Wnon-virtual-dtor	当一个类有多态性,而又没有虚析构函数时,发出警告。-Wall会开启这个选项。
-Wreorder	如果代码中的成员变量的初始化顺序和它们实际执行时初始化顺序不一致,给出警告。
-Wno-deprecated	使用过时的特性时不要给出警告。
-Woverloaded-virtual	如果函数的声明隐藏住了基类的虚函数,就给出警告。
Machine Dependent Options (Intel)	
-mtune=cpu-type	为指定类型的 CPU 生成代码。cpu-type可以是:i386,i486,i586,pentium,i686,pentium4 等等。
-msse 	使用或者不使用MMX,SSE,SSE2指令。
-msse2 	
-mmmx 	
-mno-sse 	
-mno-sse2 	
-mno-mmx	
-m32 	生成32位/64位机器上的代码。
0	
-mpush-args 	(不)使用 push 指令来进行存储参数。默认是使用。
-mno-push-args	
-mregparm=num	当传递整数参数时,控制所使用寄存器的个数。
"-mtrap-large-shift  
-mhandle-large-shift"	包含一些指令,用于检测大于31位的位移(bit-shift);根据相应的选项,对这样的位移发出自陷 (trap)或执行适当的处理代码.默 认情况下, GCC对大位移不做特别处理.  
 -mtrap-large-shift-mhandle-large-shift  	包含一些指令,用于检测大于31位的位移(bit-shift);根据相应的选项,对这样的位移发出自陷 (trap)或执行适当的处理代码.默 认情况下, GCC对大位移不做特别处理.  
 -muse-div-instruction  	很早以前的88K型号没有(div)除法指令,因此默认情况下GCC避免产生这条指令.而这个选项告诉GCC该指令是 安全的.  
 -mversion-03.00  	在DG
 -mwarn-passed-structs  	如果某个函数把结构当做参数或结果传递, GCC发出警告.随着C语言的发展,人们已经改变了传递结构的约定, 它往往导致移植问题.默认情况 下, GCC不会发出警告.  
 -mfp-in-toc  	
 -mno-fp-in-toc  	控制是否把浮点常量放到内容表(TOC)中,内容表存放所有的全局变量和函数地址.默认情况下, GCC把浮点常量放到 这里;如果TOC溢 出, `-mno-fp-in-toc'选项能够减少TOC的大小,这样就可以避免溢出.  
 -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'选项.  
 -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
 -mgas  	产生用于GNU汇编器的代码.在OSF
 -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  	#NAME?
 -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  	#NAME?
 -G num  	把小于等于num字节的全局或静态数据放到小的数据段或bss段,而不是普通的数据段或bss段. 这样汇编器可以输出基于全局指针(gp 或$28),的单字内存访问指令而非普通的双字指令.默认情况下, 用MIPS汇编器时num是8,而GNU汇编器则为0.另外, -Gnum选项也被传 递 给汇编器和连接器.所有的模块必须在相同的-Gnum值下编译.  
 -nocpp  	汇编用户汇编文件(带有`.s'后缀)时,告诉MIPS汇编器不要运行预处理器.  
 -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寄存器返回.  
 -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开关编译过的目标码调用,它也必须 用这个选项编译.  这个选项的典型用法是建立内核,内核不使用任何浮点寄存器,因此没必要保存和恢复这些寄存器.  
 -fnonnull-objects  	假设通过引用(reference)取得的对象不为null (仅C++).  一般说来, GNU C++对通过引用取得的对象作保守假设.例如,编译器一定会检查下似代码中的a不为 null:  
 -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寄存器.  如果在可执行模块中,把这个选项说明的寄存器用作固定角色将会产生灾难性结果,如栈指针或帧指针.  
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值