GCC 4
Section: GNU Tools (1)Updated: 2003/12/05
机器相关选项(MACHINE DEPENDENT OPTION)
每一种目标机型都有自己的特别选项 , 这些选项用 ` -m ' 开关引导 , 选择不同的硬件型号或配置 --- 例如 , 68010 还是 68020, 有没有浮点协处理器 . 通过指定选项 , 安装 编译器的一个版本能够为所有的型号或配置进行编译 .
此外,编译器的某些配置支持附加的特殊选项,通常是为了在命令行上兼容这个平台的其他编译器.
下面是针对68000系列定义的`-m'选项:
- -m68000
- -mc68000
-
输出 68000 的目标码 . 如果编译器按基于 68000 的系统配置 , 这个选项就是缺省选项 .
- -m68020
- -mc68020
-
输出 68020 的目标码 ( 而不是 68000). 如果编译器按基于 68020 的系统配置 , 这个选项就是缺省选项 .
- -m68881
-
输出包含 68881 浮点指令的目标码 . 对于大多数基于 68020 的系统这是缺省选项 , 除非设置编译器时指定了
-nfp .
- -m68030
-
输出 68030 的目标码 . 如果编译器按基于 68030 的系统配置 , 这个选项就是缺省选项 .
- -m68040
-
输出 68040 的目标码 . 如果编译器按基于 68040 的系统配置 , 这个选项就是缺省选项 .
- -m68020-40
-
输出 68040 的目标码 , 但是不使用新指令 . 生成的代码可以在 68020/68881 上 , 也可以在 68030 或 68040 上较有效地运行 .
- -mfpa
-
输出包含 SUN FPA 浮点指令的目标码 .
- -msoft-float
-
输出包含浮点库调用的目标码 .
警告: 所需的库不是 GNU CC 的组成部分 . 一般说来 GCC 使用该机型本地 C 编译器的相应部件 , 但是作交叉编译时却不能直接使用 . 你必须自己管理提供合适的函数库用于交叉编译 .
- -mshort
-
认为
int 类型是 16 位宽 , 相当于
short int.
- -mnobitfield
-
不使用位域 (bit-field) 指令 . `
-m68000' 隐含指定了 `
-mnobitfield'.
- -mbitfield
-
使用位域指令 . `
-m68020' 隐含指定了 `
-mbitfield'. 如果你使用未改装的 gcc, 这就是 默认选项 .
- -mrtd
-
采用另一种函数调用约定 , 函数接受固定数目的参数 , 用
rtd 指令返回 , 该指令返回时弹出栈内的参数 . 这个 方法能够使调用者节省一条指令 , 因为他这里不需要弹出参数 .
这种调用约定不兼容UNIX的正常调用.因此如果你需要调用UNIX编译器编译的库函数,你就不能使用这个选项.
此外,所有参数数量可变地函数必须提供函数原型(包括printf);否则编译器会生成错误的调用代码.
另外,如果调用函数时携带了过多的参数,编译器将生成严重错误的代码. (正常情况下,多余的参数被安全无害的忽略.)
68010和68020处理器支持rtd指令,但是68000不支持.
下面是针对VAX定义的`-m'选项:
- -munix
-
禁止输出某些跳转指令 (
aobleq 等等 ), VAX 的 UNIX 汇编器无法跨越长范围 (long ranges) 进行处理 .
- -mgnu
-
如果使用 GNU 汇编器 , 则输出那些跳转指令 ,
- -mg
-
输出 g-format 浮点数 , 取代 d-format.
下面是SPARC支持的`-m'选项开关:
-mfpu
- -mhard-float
-
输出包含浮点指令的目标码 . 这是缺省选项 .
-mno-fpu
- -msoft-float
-
输出包含浮点库调用的目标码 .
警告: 没有为 SPARC 提供 GNU 浮点库 . 一般说来使用该机型本地 C 编译器 的相应部件 , 但是不能直接用于交叉编译 . 你必须自己安排 , 提供用于交叉编译的库函数 .
-msoft-float改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有意义.
-mno-epilogue
- -mepilogue
-
使用
-mepilogue ( 缺省 ) 选项时 , 编译器总是把函数的退出代码放在函数的尾部 . 任何在函数中间 的退出语句 ( 例如 C 中的 return 语句 ) 将产生出跳转指令指向函数尾部 .
使用-mno-epilogue选项时,编译器尽量在每个函数退出点嵌入退出代码.
-mno-v8
- -mv8
- -msparclite
-
这三个选项选择不同种类的 SPARC 系统 .
默认情况下(除非特别为Fujitsu SPARClite配置), GCC生成SPARC v7目标码.
-mv8生成SPARC v8目标码.他和v7目标码唯一的区别是,编译器生成整数乘法和整数除法指令, SPARC v8支持该指令,而v7体系不支持.
-msparclite生成SPARClite目标码.增加了SPARClite支持的整数乘法,整数除法单步扫描 (integer divide step and scan (ffs))指令. v7体系不支持这些指令.
-mcypress
- -msupersparc
-
这两个选项选择处理器型号 , 针对处理器进行代码优化 .
-mcypress选项(默认项)使编译器对Cypress CY7C602芯片优化代码, SparcStation/SparcServer 3xx系列使用这种芯片.该选项也适用于老式的SparcStation 1, 2, IPX 等机型..
-msupersparc选项使编译器对SuperSparc处理器优化代码, SparcStation 10, 1000 和2000系列使用这种芯片.同时该选项启用完整的SPARC v8指令集.
下面是针对Convex定义的`-m'选项:
- -mc1
- 输出 C1 的目标码 . 当编译器对 C1 配置时 , 这是默认选项 .
- -mc2
- 输出 C2 的目标码 . 当编译器对 C2 配置时 , 这是默认选项 .
- -margcount
-
在每个参数列表的前面放置一个参数计数字 (argument count word). 某些不可移植的 Convex 和 Vax 程序需要这个参数计数字 . ( 调试器不需要他 , 除非函数带有变长参数列表 ; 这个信息存放在符号表中 .)
- -mnoargcount
-
忽略参数计数字 . 如果你使用未改装的 gcc, 这是默认选项 .
下面是针对AMD Am29000定义的`-m'选项:
- -mdw
- 生成的目标码认为 DW 置位 , 就是说 , 字节和半字操作由硬件直接支持 . 该选项是默认选项 .
- -mnodw
- 生成的目标码认为 DW 没有置位 .
- -mbw
- 生成的目标码认为系统支持字节和半字写操作 . 该选项是默认选项 .
- -mnbw
- 生成的目标码认为系统不支持字节和半字写操作 . 该选项隐含开启了 ` -mnodw' 选项 .
- -msmall
- 使用小内存模式 , 小内存模式假设所有函数的地址位于某个 256 KB 段内 , 或者所有函数的绝对地址小于 256K. 这样 就可以用 call 指令代替 const, consth, calli 指令序列 .
- -mlarge
- 假设不能使用 call 指令 ; 这是默认选项 .
- -m29050
- 输出 Am29050 的目标码 .
- -m29000
- 输出 Am29000 的目标码 . 这是默认选项 .
- -mkernel-registers
-
生成的目标码引用
gr64-gr95 寄存器而不是
gr96-gr127 寄存器 . 该选项可以用于编译 内核代码 , 内核需要一组全局寄存器 , 这些全局寄存器和用户模式使用的寄存器完全无关 .
注意,使用这个选项时, `-f'选项中的寄存器名字必须是normal, user-mode, names.
- -muser-registers
- 使用普通全局寄存器集 gr96-gr127. 这是默认选项 .
- -mstack-check
-
在每次堆栈调整后插入一条
__msp_check 调用 . 这个选项常用于内核代码 .
下面是针对Motorola 88K体系定义的`-m'选项:
- -m88000
- 生成的目标码可以在 m88100 和 m88110 上正常工作 .
- -m88100
- 生成的目标码在 m88100 上工作的最好 , 但也可以在 m88110 上运行 .
- -m88110
- 生成的目标码在 m88110 上工作的最好 , 可能不能在 m88100 上运行 .
- -midentify-revision
- 在汇编器的输出端包含一条 ident 指令 , 记录源文件名 , 编译器名字和版本 , 时标 , 以及使用的编译选项 ,
- -mno-underscores
- 在汇编器的输出端 , 符号名字前面不添加下划线 . 默认情况是在每个名字前面增加下划线前缀 .
- -mno-check-zero-division
- -mcheck-zero-division
- 早期型号的 88K 系统在除零操作上存在问题 , 特定情况下许多机器无法自陷 . 使用这些选项可以避免包含 ( 或可以 显明包含 ) 附加的代码 , 这些代码能够检查除零错 , 发送例外信号 . GCC 所有 88K 的配置默认使用 ` -mcheck-zero-division' 选项 .
- -mocs-debug-info
- -mno-ocs-debug-info
- 包含 ( 或忽略 ) 附加的调试信息 ( 关于每个栈架结构中寄存器的使用 ), 88Open Object Compatibility Standard, ``OCS'', 对此信息做了说明 . GDB 不需要这些额外信息 . DG/UX, SVr4, 和 Delta 88 SVr3.2 的默认配置是包含调试信息 , 其他 88k 机型的默认配置是忽略这个信息 .
- -mocs-frame-position
- -mno-ocs-frame-position
- 强制 ( 或不要求 ) 把寄存器值存储到栈架结构中的指定位置 ( 按 OCS 的说明 ). DG/UX, Delta88 SVr3.2 和 BCS 的默认配置使用 ` -mocs-frame-position' 选项 ; 其他 88k 机型的默认配置是 ` -mno-ocs-frame-position'.
- -moptimize-arg-area
- -mno-optimize-arg-area
-
控制如何在堆栈结构中存储函数参数 . `
-moptimize-arg-area' 节省空间 , 但是有可能宕掉某些 调试器 ( 不是 GDB). `
-mno-optimize-arg-area' 证实比标准选项好 . 默认情况下 GCC 不优化参数域 .
- -mshort-data-
-
num 通过和
r0 关联 , 产生较小的数据引用 (data reference), 这样就可以用单指令调入 一个数值 ( 而不是平常的双指令 ). 用户通过选项中的
num 控制改变哪种数据引用 . 例如 , 如果你指定了 `
-mshort-data-512', 那么受影响的数据引用是小于 512 字节的数据移动 .
-mshort-data-
num 选项对大于 64K 的
num 无效 .
-mserialize-volatile
- -mno-serialize-volatile
-
产生 , 或不产生代码来保证对易变内存访问的结果一致 .
对于常用的处理器子型号, GNU CC始终默认保证这种一致性.如何实现结果一致取决于处理器子型号.
m88100处理器不对内存引用重新安排,因此访问结果始终一致.如果使用了`-m88100'选项, GNU CC 不产生任何针对结果一致的特别指令.
m88110处理器的内存引用顺序并不始终符合指令请求的引用顺序.特别是某条读取指令可能在先前的存储指令之前执行. 多处理器环境下,乱序访问扰乱了易变内存访问的结果一致.因此当使用`-m88000'或`-m88110' 选项时, GNU CC在适当的时候产生特别的指令迫使执行顺序正确.
这些用于保证一致性的额外代码有可能影响程序的性能.如果你确认能够安全地放弃这种保证,你可以使用 `-mno-serialize-volatile'选项.
如果你使用`-m88100'选项,但是需要在m88110处理器上运行时的结果一致,你应该加上 `-mserialize-volatile'选项.
-msvr4
- -msvr3
- 打开 (` -msvr4') 或关闭 (` -msvr3') 和 System V 第四版 (SVr4) 相关的 编译器扩展 . 效果如下 :
- *
- 输出哪种汇编语法 ( 你可以使用 ` -mversion-03.00' 选项单独选择 ).
- *
- ` -msvr4' 使 C 预处理器识别 ` #pragma weak' 指令
- *
- ` -msvr4' 使 GCC 输出额外的声明指令 (declaration directive), 用于 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 不会发出警告 .
下面的选项用于IBM RS6000:
-mfp-in-toc
- -mno-fp-in-toc
-
控制是否把浮点常量放到内容表 (TOC) 中 , 内容表存放所有的全局变量和函数地址 . 默认情况下 , GCC 把浮点常量放到 这里 ; 如果 TOC 溢出 , `
-mno-fp-in-toc' 选项能够减少 TOC 的大小 , 这样就可以避免溢出 .
下面的`-m'选项用于IBM RT PC:
- -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' 选项 .
下面的`-m'选项用于MIPS家族的计算机:
- -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/1 参考平台 , 它使用 OSF/rose 目标格式 . 如果打开了任一个
-ggdb,
-gstabs, 或
-gstabs+ 选项开关 ,
mips-tfile 程序就把 stab 封装在 MIPS ECOFF 里面 .
- -mgas
-
产生用于 GNU 汇编器的代码 . 在 OSF/1 参考平台上这是默认选项 , 它使用 OSF/rose 目标格式 .
- -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
-
-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 或
$28), 的单字内存访问指令而非普通的双字指令 . 默认情况下 , 用 MIPS 汇编器时
num 是 8, 而 GNU 汇编器则为 0. 另外 ,
-G
num 选项也被传递 给汇编器和连接器 . 所有的模块必须在相同的
-G
num 值下编译 .
- -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寄存器返回.