Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103639260
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-17 17:03:37

下面的`-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
阅读(195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~