跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:C 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
B.2.7 -Dname[( arg[,arg])][= expansion]
B.2.59 -Qoption phase option[,option..]
B.2.65 -traceback[={ %none|common|signals_list}]
B.2.79.1 用于 SPARC 和 x86 的 -xarch 标志
B.2.81 -xbinopt={prepare| off}
B.2.82 -xbuiltin[=( %all|%default|%none)]
B.2.89.1 -xcheck=init_local 的初始化值
B.2.94 -xdebugformat=[stabs|dwarf ]
B.2.97 -xdumpmacros[= value[,value...]]
B.2.103 -xinstrument=[ no%]datarace
B.2.108 -xkeepframe[=[ %all,%none,name,no% name]]
B.2.137 -xpchstop=[file |<include>]
B.2.141 -xprefetch[= val[,val]]
B.2.142 -xprefetch_auto_type= a
B.2.145 -xprofile_ircache[ =path]
B.2.155.1 -xtarget 值(SPARC 平台)
B.2.160 -xtrigraphs[={ yes|no}]
本节按字母顺序介绍 cc 选项。cc(1) 手册页中也提供了这些说明。使用 cc -flags 选项可获得一行有关这些说明的摘要。
注明特定于一个或多个平台的选项可被接受,且不会出现错误,但在其他所有平台上会被忽略。
在调用每个组件时显示该组件,但不实际执行它。还显示命令选项扩展的过程。
将 name 作为谓词与指定的 tokens 关联,如同使用 #assert 预处理指令一样。预断言:
system(unix)
machine(sparc) (SPARC)
machine(i386) (x86)
cpu(sparc) (SPARC)
cpu(i386) (x86)
这些预断言在 -Xc 模式下无效。
后面仅跟随一个短划线 (-) 的 -A 将导致所有预定义宏(以 __ 开头的宏除外)和预定义断言被忽略。
指定用于链接的库绑定是 static 类型还是 dynamic 类型,可分别指明库是非共享的还是共享的。
如果给定 -lx 选项,则 -Bdynamic 使链接编辑器查找名称为 libx.so 的文件,然后查找名称为 libx.a 的文件。
–Bstatic 使链接编辑器仅查找名称为 libx.a 的文件。此选项可作为一个切换开关在命令行中多次指定。此选项及其参数将传递给 ld(1)。
注 - 在 Oracle Solaris 64 位编译环境中,许多系统库(例如 libc)只能作为动态库使用。因此,请勿在命令行上将 -Bstatic 用作最后一个切换开关。
此选项及其参数传递给链接程序。
防止 C 预处理程序删除注释,位于预处理指令行中的注释除外。
指示 C 编译器用 ld(1) 抑制链接并为每个源文件生成一个 .o 文件。您可使用 -o 选项显式指定单个目标文件。当编译器生成每个 i 或 . c 输入文件的目标代码时,总是会在当前的工作目录中创建一个对象 (.o) 文件。如果抑制链接步骤,将会同时抑制删除目标文件。
使用可选参数定义宏,如同使用 #define 预处理指令定义宏一样。如果未指定 =expansion,则编译器假定为 1。
有关编译器预定义宏的列表,请参见 cc(1) 手册页。
-dn 指定链接编辑器中的静态链接。
此选项及其参数将传递给 ld(1)。
注 - 如果将此选项与动态库结合使用,将导致致命错误。大多数系统库仅作为动态库可用。
(SPARC) 已废弃。您不该使用此选项。改用 -xmemalign=8s。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项。在 x86 平台上会在无提示的情况下忽略此选项。
仅通过预处理程序运行源文件,并将输出发送给 stdout。预处理程序直接构建到编译器中,但 -Xs 模式除外,因为该模式会调用 /usr/ccs/lib/cpp。包含预处理程序行号信息。另请参见 -P 选项的描述。
如果要将字符串 "error:" 作为前缀添加到错误消息开头以将错误消息与警告消息相区分,可使用此选项。此前缀也可附加到通过 -errwarn 转换成错误的警告。
表 B-1 -errfmt 标志
|
如果不指定此选项,则编译器将其设置为 -errfmt=no%error。如果指定了 -errfmt 但未提供值,则编译器会将其设置为 -errfmt=error。
将来自头文件的警告限制为由下表中的标志所指示的头文件组:
表 B-2 —errhdr 选项
|
此命令抑制 C 编译器警告消息,但对错误消息没有影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。下表列出了 -erroff 值。
表 B-3 -erroff 标志
|
缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。
-erroff 选项只能抑制来自 C 编译器前端并在使用 -errtags 选项时显示标记的警告消息。您可以更好地控制错误消息抑制。请参见2.11.8 error_messages。
使用此选项可在编译器发现类型不匹配时控制所生成错误消息的详细程度。当编译器发现涉及到大聚集的类型不匹配时,此选项特别有用。
i 可以为下表中所列出的值之一。
表 B-4 -errshort 标志
|
如果不指定 -errshort,编译器会将该选项设置为 -errshort=full。如果指定了 -errshort 但未提供值,则编译器会将该选项设置为 -errshort=tags。
该选项不会累积。它接受命令行中指定的最后一个值。
为 C 编译器前端的每条警告消息显示消息标志,可以使用 -erroff 选项抑制该消息,或使用 -errwarn 选项将其设置为致命错误。来自 C 编译器驱动程序以及 C 编译系统其他组件的消息不带错误标记,使用 -errof 选项并不能抑制这些消息,而使用 -errwarn 选项也不会产生致命错误。
a 可以是 yes 或 no。缺省值为 -errtags=no。指定 -errtags 与指定 -errtags=yes 等效。
使用 -errwarn 选项可以在出现指定的警告消息时使 C 编译器退出,并指示故障状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序很重要,例如如果出现除 tag 之外的任何警告,%all,no%tag 会使 cc 以致命状态退出。
由于编译器错误检查的改善和功能的增加,C 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版中编译时也可能出现错误。
只有来自 C 编译器前端在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C 编译器以失败状态退出。
下表详细列出了 -errwarn 值:
表 B-5 -errwarn 标志
|
缺省值为 -errwarn=%none。单独指定 -errwarn 与 -errwarn=%all 等效。
此选项是一个宏,可有效用作调整可执行文件以实现最佳运行时性能的起点。-fast 选项宏随编译器发行版的升级而变化,并扩展为目标平台特定的多个选项。可使用 -# 选项或 -xdryrun 检查 -fast 的扩展选项,并将 -fast 的相应选项结合到正在进行的可执行文件优化过程中。
-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见B.2.112 -xlibmopt。
-fast 选项会影响 errno 的值。有关更多信息,请参见2.13 保留 errno 的值。
用 -fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见A.1.2 编译时选项和链接时选项。
–fast 选项不适于计划在编译机器之外的其他目标机器上运行的程序。在这种情况下,请在 -fast 后附带相应的 -xtarget 选项。例如:
cc -fast -xtarget=generic ...
对于依赖于 SUID 指定的异常处理的 C 模块,请在 -fast 后附带 -xnolibmil:
% cc -fast -xnolibmil
使用 -xlibmil 时,通过设置 errno 或调用 matherr(3m) 无法标记异常。
–fast 选项不适于要求与 IEEE 754 标准严格一致的程序。
下表列出了 -fast 在各平台中选择的选项集。
表 B-6 -fast 扩展选项标志
|
注 - 有些优化对程序行为进行特定假定。如果程序不符合这些假定,应用程序可能会失败或产生错误结果。请参阅各个选项的描述,以确定您的程序是否适合用 -fast 编译。
由这些选项执行的优化可能会改变由 ISO C 和 IEEE 标准定义的程序的行为。有关详细信息,请参见特定选项的描述。
-fast 标志的作用与命令行上的宏扩展相同。因此,您可以通过在 -fast 后附带预期的优化级别或代码生成选项来覆盖优化级别和代码生成选项。使用 -fast -xO4 对进行编译类似于使用 -xO2 -xO4 对进行编译。后者优先。
在 x86 上,-fast 选项包括 -xregs=frameptr。有关详细信息,特别是编译混合 C、Fortran 和 C++ 源代码时,请参见该选项的介绍。
请勿对依赖于 IEEE 标准异常处理的程序使用此选项;否则会产生不同的数值结果、程序提前终止或意外的 SIGFPE 信号。
要在运行的平台上查看 —fast 的实际扩展,请使用以下命令:
% cc -fast -xdryrun |& grep ###
表 B-7 -features 标志
|
旧的 C 和 C++ 对象(使用本发行版之前的 Solaris Studio 编译器创建的对象)可以与新的 C 和 C++ 对象链接,而不会更改旧对象的行为。要获得标准的符合规范的行为,您必须使用当前编译器重新编译旧代码。
typeof(int) i;/* declares variable "i" to be type int*/ typeof(i+10) j;/* declares variable "j" to be type int, the type of the expression */ i = sizeof(typeof(j)); /* sizeof returns the size of the type associated with variable "j" */ int a[10]; typeof(a) b;/* declares variable "b" to be array of size 10 */
typeof 运算符在宏定义(其中参数可以是任意类型)时特别有用。例如:
#define SWAP(a,b) { typeof(a) temp; temp = a; a = b; b = temp; }
表 B-8 -flteval 标志
|
如果未指定 -flteval,编译器会将其设置为 -flteval=any。如果指定了 -flteval 但未提供值,则编译器会将其设置为 -flteval=2。
-flteval=2 只能与 -xarch=sse、pentium_pro、ssea 或 pentium_proa 一起使用。此外,-flteval=2 还与 -fprecision 或 -nofstore 选项组合不兼容。
另请参见D.1.1 浮点计算器的精度。
(SPARC) 允许自动生成浮点混合乘加指令。-fma=none 表示禁止生成这些指令。-fma=fused 表示允许编译器通过使用浮点混合乘加指令,尝试寻找改进代码性能的机会。
缺省值是 -fma=none。
要使编译器生成乘加指令,最低要求是 -xarch=sparcfmaf 且优先级别至少为 -xO2。如果生成了乘加指令,编译器会标记此二进制程序,以防止该程序在不受支持的平台上执行。
乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 -fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。
此选项是用于 -fns 和 -ftrap=common 的宏。
在 SPARC 平台上,此选项用于启用非标准浮点模式。
对于 x86 平台,此选项用于选择 SSE 刷新为零模式以及非正规数为零模式(如果可用),从而导致将次正规结果刷新为零;如果可用的话,此选项还会导致将次正规操作数视为零。此选项对不使用 SSE 或 SSE2 指令集的传统 x86 浮点运算没有影响。
缺省值为 -fns=no,即标准浮点模式。-fns 与 -fns=yes 相同。
可以选择使用 =yes 或 =no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。
在一些 SPARC 系统上,使用非标准浮点模式会禁用“渐进下溢”,导致将微小的结果刷新为零,而不是产生非正规数。它还导致次正规操作数被替换为零而无提示。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。
在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。有关详细信息,请参见《数值计算指南》。
在 SPARC 系统上,只有编译主程序时此选项才有效。
与 -KPIC 等效
与 -Kpic 等效
(x86) -fprecision={single, double, extended}
将浮点控制字中的舍入精度模式位分别初始化为 single(24 位)、double(53 位)或 extended(64 位)。缺省的浮点舍入精度模式为 extended。
注意,在 x86 中,浮点舍入精度模式的设置只影响精度,不影响指数、范围。
该选项仅在 x86 系统上且仅在编译主程序时才有效,但如果编译 64 位 (-m64) 或 SSE2 启动的 (-xarch=sse2) 处理器,忽略此选项。在 SPARC 系统上也忽略此选项。
设置程序初始化期间在运行时建立的 IEEE 754 舍入模式。
r 必须是以下值之一: nearest、 tozero、negative、positive。
缺省值为 -fround=nearest。
含义与 ieee_flags 子例程的含义相同。
如果 r 为 tozero、negative 或 positive,此标志将在程序开始执行时分别将舍入方向模式设置为舍入到零、舍入到负无穷大或舍入到正无穷大。当 r 为 nearest 或未使用 -fround 标志时,舍入方向模式将保留其初始值不变(缺省为舍入到最接近的值)。
只有编译主程序时该选项才有效。
编译器缺省采用 -fsimple=0。指定 -fsimple 与指定 -fsimple=1 等效。
如果存在 n,它必须是 0、1 或 2。
表 B-9 -fsimple 标志
|
即使使用 -fsimple=2,也不允许优化器在不产生任何内容的程序中引入浮点异常。
有关优化对精度的影响的更详细说明,请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance Computing》。
(仅限 -Xt 和 -Xs 模式)使编译器按单精度而非双精度对 float 表达式求值。由于已按单精度对 float 表达式进行求值,因此如果在 -Xa 或 -Xc 模式下使用编译器,此选项将无效。
(x86) 将表达式或函数赋值给一个变量时或将表达式强制转换为短浮点类型时,该命令可使编译器将浮点表达式或函数的值转换为赋值语句左侧的类型,而不是在寄存器中保留值。由于舍入和截尾,结果可能会与使用寄存器值生成的结果不同。这是缺省模式。
使用 -nofstore 标志可以禁用此选项。
设置启动时生效的 IEEE 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。
t 可以为下表中所列出的值之一。
表 B-10 -ftrap 标志
|
请注意,no% 前缀仅用于修改 %all 和 common 值的含义,且必须与其中的一个值一起使用,如以下示例所示。no% 前缀不会显式导致禁用特定的陷阱。
如果未指定 –ftrap,则编译器假定 –ftrap=%none。
示例:–ftrap=%all,no%inexact 会设置所有陷阱,但 inexact 除外。
如果使用 -ftrap=t 编译一个例程,则应使用同一选项编译该程序的所有例程,以免出现意外结果。
使用 -ftrap=inexact 陷阱时务必谨慎。只要浮点值不能精确表示,使用 – ftrap=inexact 便会产生自陷。例如,以下语句就会产生这种情况:
x = 1.0 / 3.0;
只有编译主程序时该选项才有效。请小心使用该选项。要启用 IEEE 陷阱,请使用 -ftrap=common。
生成共享对象而非动态链接的可执行文件。此选项将传递给 ld(1),并且不能与 -dn 选项一起使用。
使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 选项。
如果通过指定 -G 以及其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在与生成的共享对象链接时也指定这些选项。
创建共享对象时,用 -m64 编译的所有 64 位 SPARC 目标文件还必须用显式 -xcode 值(如B.2.91 -xcode[= v]中所述)进行编译。
生成附加的符号表信息,以供使用 dbx(1) 和性能分析器 analyzer(1) 进行调试。
如果指定 -g,并且优化级别为 -xO3 或更低,则编译器提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。
如果指定 -g,并且优化级别为 -xO4,则编译器提供进行全面优化的最佳效果符号信息。
使用 -g 选项进行编译,以使用性能分析器的全部功能。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和性能分析器手册。
使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。
注 - 如果在不同的步骤中编译和链接程序,则在一个步骤中使用 —g 选项而在另一个步骤中不使用该选项不会影响程序的正确性,但会影响调试程序的能力。没有使用 —g(或 —g0)编译但使用 —g(或 —g0)链接的任何模块都将不能正常进行调试。请注意,要进行调试,通查需要使用 —g 选项(或 —g0 选项)对包含函数 main 的模块进行编译。
有关调试的更多信息,请参见《使用 dbx 调试程序》手册。
—g3 选项与 —g 相同,其中带有附加调试符号表信息,可以使 dbx 显示源代码中的宏的扩展。与使用 —g 进行编译相比,此附加符号表信息可能会增加生成的 .o 和可执行文件的大小。
输出到标准错误,每行一个错误,包含当前编译期间每个文件的路径名。这样输出的目的是显示包含在其他文件中的文件。
在以下示例中,程序 sample.c 包含文件 stdio.h 和 math.h。math.h 包含文件 floatingpoint.h,该文件本身还包含使用 sys/ieeefp.h 的函数。
% cc -H sample.c /usr/include/stdio.h /usr/include/math.h /usr/include/floatingpoint.h /usr/include/sys/ieeefp.h
为共享动态库分配一个名称,从而可以获得不同版本的库。name 应与 -o 选项提供的文件名相同。-h 和 name 之间的空格是可选的。
链接程序会为该库分配指定的 name,并在库文件中将该名称记录为库的内在名称。如果 -hname 选项不存在,则库文件中不记录任何内在名称。
当运行时链接程序将库装入可执行文件时,会将内部名称从库文件复制到可执行文件的所需共享库文件列表中。每个可执行文件都有这样的列表。如果未提供共享文件的内部名称,链接程序就会复制共享库文件的路径。
-I dir 将 dir 添加到在其中搜索 #include 文件(/usr/include 前是相对文件名)的目录列表中,也就是说,这些目录路径不以 /(斜线)开头。
以指定的顺序搜索多个 -I 选项的目录。
有关编译器搜索模式的更多信息,请参见2.16.1 使用 -I- 选项更改搜索算法。
将选项传递给链接程序,以忽略任何 LD_LIBRARY_PATH 或 LD_LIBRARY_PATH_64 设置。
此选项使编译器将 filename 视为作为 #include 预处理程序指令出现在主源文件的第一行。考虑源文件 t.c:
main() { ... }
如果使用命令 cc -include t.h t.c 编译 t.c,则编译时好像源文件包含以下项:
#include "t.h" main() { ... }
编译器首先会在当前工作目录而不是包含主源文件的目录中搜索 filename,这与显式包括某个文件时的情况相同。例如,下面的目录结构包含两个名称相同但位置不同的头文件:
foo/ t.c t.h bar/ u.c t.h
如果您的工作目录是 foo/bar,并且您使用命令 cc ../t.c -include t.h 进行编译,则编译器会包括 foo/bar 中的 t.h 而不是 foo/ 中的此文件,后者是源文件 t.c 内包含 #include 指令时的情况。
如果编译器在当前工作目录中找不到使用 -include 指定的文件,则会在正常目录路径中搜索该文件。如果您指定多个 -include 选项,则文件的包括顺序与它们在命令行中的显示顺序相同。
(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic32。
有关更多信息,请参见B.2.91 -xcode[= v]。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic13。有关更多信息,请参见B.2.91 -xcode[= v]。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
(x86) 生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。
将 dir 添加到通过 ld(1) 在其中搜索库的目录列表中。此选项及其参数将传递给 ld(1)。
注 - 任何时候都不要将编译器安装目录(/usr/include、/lib 或 /usr/lib)指定为搜索目录。
与目标库 libname.so 或 libname.a 链接。库在命令中的顺序很重要,因为符号是从左向右进行解析。
此选项必须位于 sourcefile 参数之后。
与 Oracle Solaris Studio 性能库进行链接。
指定编译的二进制对象的内存模型。
使用 -m32 来创建 32 位可执行文件和共享库。使用 -m64 来创建 64 位可执行文件和共享库。
在所有 Oracle Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、指针数据类型)为缺省值。在支持 64 位的 Linux 平台上,LP64 内存模型(64 位 long、指针数据类型)为缺省值。-m64 仅允许在支持 LP64 模型的平台上使用。
使用 -m32 编译的目标文件或库无法与使用 -m64 编译的目标文件或库链接。
使用 -m32|-m64 编译的模块必须还使用 -m32 |-m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见A.1.2 编译时选项和链接时选项。
在 x86/x64 平台上使用 -m64 编译具有大量静态数据的应用程序时,可能还需要 -xmodel=medium。请注意,部分 Linux 平台不支持中等模型。
请注意,在早期的编译器发行版中,由 -xarch 选项中选择的指令集来指定内存模型(ILP32 或 LP64)。从 Oracle Solaris Studio 12 编译器开始,此缺省值就不再是这样了。在大多数平台上,仅需将 -m64 添加到命令行便可以创建 64 位对象。
在 Oracle Solaris 上,-m32 为缺省值。在支持 64 位程序的 Linux 系统上,-m64 -xarch=sse2 是缺省选项。
另请参见 -xarch 的描述。
从目标文件的 .comment 部分中删除重复字符串。使用 -mc 标志时,会调用 mcs -c。
(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=1i 选项。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=2i 选项。有关更多信息,请参见B.2.124 -xmemalign=ab。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
-mr 可从 .comment 部分中删除所有字符串。使用此标志时,会调用 mcs -d -a。
-mr,string 可从 .comment 部分中删除所有字符串,并在目标文件的该部分插入 string。如果 string 包含嵌入空白,则必须将其括入引号。空 string 将导致 .comment 部分为空。此选项将作为 -d -astring 传递给 mcs。
使用此选项,可以通过 Oracle Solaris 线程或 POSIX 线程 API 编译和链接多线程代码。-mt=yes 选项确保库以正确的顺序链接。
此选项将 -D_REENTRANT 传递给预处理程序。
要使用 Oracle Solaris 线程,请包括 thread.h 头文件并使用 —mt=yes 选项进行编译。要在 Oracle Solaris 平台上使用 POSIX 线程,请包括 pthread.h 头文件并使用 —mt=yes 选项进行编译。
在 Linux 平台上,只能使用 POSIX 线程 API。(在 Linux 平台上不能使用 libthread。)因此,Linux 平台上的 -mt=yes 会添加 -lpthread,而不是 -lthread。要在 Linux 平台上使用 POSIX 线程,请使用 —mt 进行编译。
请注意,当使用 -G 进行编译时,-lthread 和 -lpthread 均不会自动包括在 -mt=yes 内。生成共享库时,您需要显式列出这些库。
-xopenmp 选项(用于使用 OpenMP 共享内存并行化 API)自动包含 -mt=yes。
如果使用 -mt=yes 进行编译并在单独的步骤中进行链接,则除了在编译步骤中外,还必须在链接步骤中使用 mt=yes 选项。如果使用 -mt=yes 编译和链接一个转换单元,则必须使用 -mt=yes 编译和链接该程序的所有单元。
-mt=yes 是编译器的缺省行为。如果不需要此行为,请使用 -mt=no 进行编译。
选项 -mt 与 -mt=yes 等效。
另请参见B.2.126 -xnolib、Oracle Solaris《多线程编程指南》和《链接程序和库指南》
(x86) 在将浮点表达式或函数赋值给一个变量或转换为短浮点类型时,不将该表达式或函数的值转换为赋值左侧的类型,而将该值保留在寄存器中。另请参见B.2.31 -fstore。
-xO3 优化级别会提高运行时性能。但是,对于依赖于被自动视为 volatile 的所有变量的程序,这可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的旧版多线程应用程序。解决方法是用 -xO2 而不是 -O 进行编译。
将输出文件命名为 filename 而非缺省的 a.out。filename 不能与输入源文件相同,因为编译器不会覆盖源文件。
filename 必须具有合适的后缀。在与 —c 一起使用时,filename 指定目标 .o 目标文件;在与 —G 一起使用时,它指定目标 .so 库文件。此选项及其参数传递给链接程序 ld。
运行 通过 C 预处理程序运行源文件。然后将输出放在带有 .i 后缀的文件中。与 -E 不同,此选项不在输出中包括预处理程序类型的行号信息。另请参见 -E 选项。
此选项现在已过时。请改用B.2.140 -xpg。
要传递多个选项,按照逗号分隔列表的顺序指定它们。可以对使用 -Qopton 传递给组件的选项进行重新排序。驱动程序识别的选项将按正确顺序排列。对于驱动程序已识别的选项,请勿使用 -Qoption。
phase 可以为以下列表中的值之一。
编译器
代码生成器 (SPARC)
预处理程序
cc 驱动程序
汇编程序
过程间优化器
中间代码翻译者 (x86)
优化器
链接编辑器 (ld)
mcs-在指定了 —mc 或 —mr 时处理目标文件的注释部分。
后优化器
lock_lint 的编译器阶段
代码生成器 (x86)
另请参见可提供等效功能的 —Wc, arg。提供 —Qoption 是为了与其他编译器兼容。
如果使用 -Qy,则将关于每个调用的编译工具的标识信息添加到输出文件的 .comment 部分,使用 mcs 可访问这部分文件。此选项对软件管理十分有用。
-Qn 可抑制此信息。
将用来指定库搜索目录的、冒号分隔的目录列表传递给运行时链接程序。如果该目录列表存在且非空,则会将其记录在输出目标文件中并传递给运行时链接程序。
如果同时指定了 LD_RUN_PATH 和 -R 选项,则 -R 选项优先。
指示 cc 生成汇编源文件,而不汇编或链接程序。汇编程序语言输出将写入后缀为 .s 的对应文件。
从输出目标文件中删除所有符号调试信息。此选项不能与 -g 一同指定。
传递给 ld(1)。
在执行中出现严重错误时发出堆栈跟踪。
当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出堆栈跟踪、转储信息并退出。如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪。
要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,但除非生成可执行二进制文件,否则将忽略该选项。使用 -traceback 和 -G 创建共享库是个错误。
表 B-11 -traceback 选项
|
如果不指定该选项,则缺省值为 -traceback=%none
只使用 -traceback 而不使用 = 信号表示 -traceback=common
如果您不需要信息转储,请将 coredumpsize 限制设置为零,如下所示:
% limit coredumpsize 0
-traceback 选项不影响运行时性能。
取消定义预处理程序符号 name。此选项可删除由 -D 在同一命令行上创建的预处理程序符号 name 的任何初始定义,包括由命令行驱动程序放置在此的定义。
-U 对源文件中的预处理程序指令没有任何影响。可以在命令行上指定多个 -U 选项。
如果在命令行中为 -D 和 -U 指定了相同的 name,则会取消定义 name,而不管这些选项出现的顺序如何。在以下示例中,-U 取消定义 __sun:
cc -U__sun text.c
由于已取消定义 __sun,因此在 test.c 中采用以下形式的预处理程序语句将不会生效。
#ifdef(__sun)
有关预定义符号的列表,请参见B.2.7 -Dname[( arg[,arg])][= expansion]。
指示编译器执行更严格的语义检查并启用其他与 lint 类似的检查。例如,以下代码在编译和执行时不会出现问题。
#include <stdio.h> main(void) { printf("Hello World.\n"); }
使用 -v 选项,该代码仍会进行编译。但是,编译器将显示以下警告:
"hello.c", line 5: warning: function has no return statement: main
-v 不能给出 lint(1) 给出的所有警告。您可以通过 lint 运行以上示例来了解差异。
将参数 arg 传递给指定的组件 c。有关组件的列表,请参见表 1-1。
前后参数之间只能用逗号分隔。所有 -W 参数均在其余的命令行参数之后进行传递。要在参数中包括逗号,请在紧靠逗号之前使用转义符 \(反斜杠)。所有 -W 参数均在常规命令行参数之后进行传递。
例如,-Wa,-o,objfile 按该顺序将 -o 和 objfile 传递给汇编程序。此外,-Wl,-I,name 将导致链接阶段覆盖动态链接程序的缺省名称 /usr/lib/ld.so.1。
这些参数相对于其他指定的命令行选项传递给工具的顺序可能会更改后续的编译器发行版。
下表列出了 c 的可能值
表 B-12 -W 标志
|
请注意,您不能使用 -Wd 将 cc 选项传递给 c 编译器。
此选项会覆盖 error_messages pragma。
-X(注意大写X)选项指定符合 ISO C 标准的各种级别。-xc99 的值影响 -X 选项所应用的 ISO C 标准的版本。-xc99 选项的缺省值为支持 1999 ISO/IEC C 标准的 -xc99=all。-xc99=none 支持 1990 ISO/IEC C 标准。有关对 1999 ISO/IEC 支持功能的讨论,请参见表 C-6。有关 ISO/IEC C 与 K&R C 的不同点的讨论,请参见G.1 libfast.a 库 (SPARC)。
-Xc
(c =一致性)对使用非 ISO C 构造的程序发出错误和警告。此选项与 ISO C 严格一致,没有 K&R C 兼容性扩展。如果使用 -Xc 选项,预定义的宏 __STDC__ 的值为 1。
-Xa
缺省编译器模式。ISO C 以及 K&R C 兼容性扩展,具有 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果 -Xa 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。如果使用 -Xa 选项,预定义的宏 __STDC__ 的值为 -0。
-Xt
(t = transition) 该选项使用 ISO C 以及 K&R C 兼容性扩展,不具有 ISO C 要求的语义更改。 如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果将 -Xt 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。使用 -Xt 选项时,预定义的宏 __STDC__ 的值为 0。
-Xs
(s = K&R C) 尝试发出有关在 ISO C 和 K&R C 之间具有不同行为的所有语言构造的警告。编译器语言包含与 K&R C 兼容的所有功能。此选项会调用 cpp 进行预处理。该模式中未定义 __STDC__。
(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见A.1.14 已过时选项。
将 arg 传递给链接程序 ld(1)。与 —z arg 等效
(仅限 Solaris x86/x64)-xaddr32=yes 编译标志将生成的可执行文件或共享对象限定为 32 位地址空间。
以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。
指定 -xaddr32=no 时,会生成常见的 64 位二进制文件。
如果未指定 -xaddr32 选项,则假定 -xaddr32=no。
如果仅指定了 -xaddr32,则假定 -xaddr32=yes。
此选项仅适用于 -m64 编译,并且仅在支持 SF1_SUNW_ADDR32 软件功能的 Oracle Solaris 平台上适用。由于 Linux 内核不支持地址空间限制,此选项在 Linux 上不可用。
链接时,如果单个目标文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。
限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。
有关更多信息,请参阅《链接程序和库指南》中介绍的 SF1_SUNW_ADDR32 软件功能定义。
编译器使用 -xalias_level 选项确定为了使用基于类型的别名分析执行优化可以进行何种假设。此选项使指定的别名级别对正在编译的转换单元生效。
如果不指定 -xalias_level 命令,编译器将假定 -xalias_level=any。如果指定不带值的 -xalias_level,则缺省值为 -xalias_level=layout。
-xalias_level 选项要求的优化级别为 -xO3 或更高。如果优化级别设置较低,则发出警告并忽略 -xalias_level 选项。
切记,如果使用 -xalias_level 选项,但无法坚持为任何别名级别描述的关于别名的所有假定和约束,则程序的行为未定义。
将 l 替换为下表中的某一术语。
表 B-13 别名歧义消除级别
为可使用 Oracle Solaris Studio 代码分析器查看的源代码生成静态分析。
使用 —xanalyze=code 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 —xanalyze=code。
缺省值为 —xanalyze=no。有关更多信息,请参见 Oracle Solaris Studio 代码分析器文档。
(仅限 Solaris)创建可供优化和监测工具 binopt(1)、code-analyzer(1)、discover(1)、collect(1) 和 uncover(1) 以后使用的二进制文件。
缺省值为 -xannotate=yes。指定不带值的 -xannotate 等效于 -xannotate=yes。
为优化使用优化和监测工具,-xannotate=yes 必须在编译时和链接时均有效。如果不使用优化和监测工具,则使用 -xannotate=no 进行编译和链接可以生成略小的二进制文件和库。
此选项在 Linux 系统上不可用。
指定目标指令集体系结构 (instruction set architecture, ISA)。
该选项将编译器生成的代码限制为特定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用此选项可能会影响二进制程序的可移植性。
注 - 分别使用 -m64 或 -m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 选项不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
指定 _asm 语句或通过 .il 内联模板文件(使用特定于体系结构的指令)进行编译时,可能需要指定合适的 -xarch 值以免出现编译错误。
下表列出了 SPARC 和 x86 平台通用的 -xarch 关键字。
表 B-14 SPARC 和 x86 平台的通用标志
|
下表介绍了 SPARC 平台上的 -xarch 关键字。
表 B-15 用于 SPARC 平台的 -xarch 标志
|
另请注意:
使用 generic、sparc、sparcvis2、sparcvis3、sparcfmaf、sparcima 编译的目标二进制文件 (.o) 可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行。
对于任何特定选择,生成的可执行文件在传统体系结构中可能无法运行或运行缓慢。而且,由于所有指令集中均未实现四精度 (long double) 浮点指令,因此编译器不在其生成的代码中使用这些指令。
下表列出了 x86 平台上的 -xarch 标志。
表 B-16 x86 上的 -xarch 标志
|
如果在 x86 平台上使用 —m64 编译或链接程序的任一部分,则也必须使用这些选项之一编译程序的所有部分。有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel-64 和 IA-32《Intel Architecture Software Developer's Manual》
另请参见1.2 x86 特殊注意事项和1.3 二进制兼容验证。
尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。例如,-xtarget=ultra2 可扩展为 -xarch=sparcvis -xchip=ultra2 -xcache=16/32/1:512/64/1。在以下命令中, -xarch=generic 覆盖了由 -xtarget=ultra2 的扩展设置的 -xarch=sparcvis。
example% cc -xtarget=ultra2 -xarch=generic foo.c
如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
注 - 此选项不能启动 OpenMP 并行化指令。
为多个处理器启用自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高,则将优化级别提高到 -xO3 并发出警告。
如果要进行自己的线程管理,请勿使用 -xautopar。
为了使执行速度更快,该选项要求使用多处理器系统。在单处理器系统中,生成的二进制文件的运行速度通常较慢。
要在多线程环境中运行已并行化的程序,必须在执行之前将环境变量 OMP_NUM_THREADS 设置为大于 1 的值。如果未设置,则缺省值为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,应将 OMP_NUM_THREADS 设置为正在运行的系统中的可用虚拟处理器数,该值可使用 Oracle Solaris psrinfo(1) 命令确定。
如果使用 -xautopar 且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的 C 运行时库包含进来。如果使用 -xautopar,而且在不同的步骤中进行编译和链接,则还必须使用 -xautopar 进行链接。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
(SPARC) 此选项现在已废弃,将在以后的编译器发行版中删除。请参见B.2.78 -xannotate[=yes| no]
指示编译器准备二进制文件,以便以后进行优化、转换和分析。此选项可用于生成可执行文件或共享对象。此选项必须与 -xO1 或更高的优化级别一起使用时才有效。使用此选项生成二进制文件时,文件大小会有所增加。
如果在不同的步骤中进行编译,则在编译步骤和链接步骤中都必须有 -xbinopt:
example% cc -c -xO1 -xbinopt=prepare a.c b.c example% cc -o myprog -xbinopt=prepare a.o
如果有些源代码不可用于编译,仍可使用此选项来编译其余代码。然后,应将其用于可创建最终库的链接步骤中。在此情况下,只有用此选项编译的代码才能进行优化、转换或分析。
使用 -xbinopt=prepare 和 -g 编译会将调试信息包括在内,从而增加可执行文件的大小。缺省值为 -xbinopt=off。
有关更多信息,请参见 binopt(1) 手册页。
使用 -xbuiltin 选项可改进调用标准库函数的代码的优化。很多标准库函数(例如在 math.h 和 stdio.h 中定义的函数)通常由多个程序使用。-xbuiltin 选项使编译器可在对性能有益时替换内部函数或内联系统函数。有关如何读取目标文件中的编译器注释来确定编译器实际对哪些函数进行替换的说明,请参见 er_src(1) 手册页。
请注意,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。另请参见2.13 保留 errno 的值。
-xbuiltin=%default 仅内联未设置 errno 的函数。errno 的值在任何优化级别上都始终是正确的,并且可以可靠地检查。对于 -xO3 或更低级别的 -xbuiltin=%default,编译器将确定哪些调用对内联有益,并且不内联其他函数。-xbuiltin=%none 选项可禁用库函数的所有替换。
如果未指定 -xbuiltin,则在使用 -xO1 和更高的优化级别编译时,缺省值为 -xbuiltin=%default;在使用 -xO0 的优化级别编译时,缺省值为 -xbuiltin=%none。如果指定不带参数的 -xbuiltin,则缺省值为 -xbuiltin=%all,并且编译器会更加主动地替换内部函数或内联标准库函数。
如果使用 -fast 进行编译,则 -xbuiltin 设置为 %all。
注 - -xbuiltin 仅内联系统头文件中定义的全局函数,而不会内联用户定义的静态函数。
当指定 -xc99=none 和 -xCC 时,编译器将接受 C++ 样式注释。特别是,可使用 // 指示注释的开始。
-xc99 选项可控制编译器对根据 C99 标准(ISO/IEC 9899:1999,编程语言 - C)实现的功能的识别。
下表列出了 o 的可接受值。可以用逗号分隔多个值。
表 B-17 -xc99 标志
|
如果未指定 -xc99,编译器缺省采用 -xc99=all,no_lib。如果指定了 -xc99,但没有指定任何值,该选项将设置为 -xc99=all。
定义可供优化器使用的缓存属性。此选项不保证使用每个特定的缓存属性。
注 - 尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
可选属性 [/ti ] 用于设置可以共享高速缓存的线程数。如果没有为 t 指定值,则缺省值为 1。
c 必须是以下值之一:
generic
native
s1/ l1/a 1[/t1]
s1/ l1/a 1[/t1]: s2/l 2/a2[ /t2]
s1/ l1/a 1[/t1]: s2/l 2/a2[ /t2]: s3/l 3/a3[ /t3]
s/l /a/t 属性定义如下:
级别为 i 的数据高速缓存的大小,以千字节为单位
级别为 i 的数据高速缓存的行大小,以字节为单位
级别为 i 的数据高速缓存的关联性
共享级别为 i 的高速缓存的硬件线程数
下表列出了 -xcache 值。
表 B-18 -xcache 标志
|
示例: -xcache=16/32/4:1024/32/1 指定以下内容:
级别 1 高速缓存具有:
16 千字节
32 字节行大小
四向关联性
级别 2 高速缓存具有:
1024 字节
32 字节行大小
直接映射关联性
(SPARC) 已废弃。您不该使用此选项。使用此选项编译生成的代码在当前的 SPARC 平台中运行较慢。应改用 -O,并利用 -xarch、-xchip 和 -xcache 的编译器缺省值。
提供此选项只是为了方便从 char 类型定义为 unsigned 的系统中迁移代码。如果不是从这样的系统中迁移,最好不要使用该选项。只有依赖 char 类型符号的代码才需要重写,以便显式指定 signed 或 unsigned。
下表列出了 o 的可接受值:
表 B-19 -xchar 标志
|
如果未指定 -xchar,编译器将假定 -xchar=s。
如果指定了 -xchar 但未指定值,编译器将假定 -xchar=s。
-xchar 选项仅会更改使用 -xchar 编译的代码中 char 类型的值范围。该选项不会更改任何系统例程或头文件中 char 类型的值范围。具体来讲,指定选项时不更改 limits.h 定义的 CHAR_MAX 和 CHAR_MIN 的值。因此,CHAR_MAX 和 CHAR_MIN 不再表示无格式 char 中可编码的值的范围。
如果使用 -xchar,则在将 char 与预定义的系统宏进行比较时要特别小心,原因是宏中的值可能带符号。对于返回可通过宏访问的错误代码的任何例程,这种情况很常见。错误代码一般是负值,因此在将 char 与此类宏中的值进行比较时,结果始终为假。负数永远不等于无符号类型的值。
请勿使用 -xchar 为通过库导出的任何接口编译例程。Oracle Solaris Studio 的所有目标平台的 ABI 将 char 类型指定为 signed,并且系统库的行为也与此相适应。目前还未对系统库针对将 char 指定为无符号的效果进行广泛测试。可以不使用该选项,而是修改代码使其与 char 类型是否带符号没有关联。类型 char 的符号因编译器和操作系统而异。
以指定的字节顺序放置多字符字符常量构成的字符,以生成一个整型常量。使用以下值之一作为 o:
low:按由低到高的字节顺序放置多字符字符常量构成的字符。
high:按由高到低的字节顺序放置多字符字符常量构成的字符。
default:按编译模式 (-X v) 所确定的顺序放置多字符字符常量构成的字符。有关更多信息,请参见2.1.2 字符常量和B.2.71 -X[c| a|t|s]。
下表列出了 o 的值。
表 B-20 -xcheck 标志
|
如果未指定 -xcheck,则编译器缺省使用 -xcheck=%none。如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%all。
在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。
使用 -xcheck=init_local,编译器可在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值。(请注意,这些值可能会发生更改,因此不应该依赖它们。)
表 B-21 基本类型的 init_local 初始化
|
为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中的指针说明进行初始化。
永远不会初始化以下局部变量类型:限定的 const、register、计算的 goto 的标签号、局部标签。
struct 中属于基本类型的字段将按照上表所述进行初始化(与 union 中第一个声明的 pointer 或 float 字段相同),以便最大限度地增加未初始化的引用生成可见错误的可能性。
数组元素也按上表所述进行初始化。
嵌套的 struct、union 和数组字段可按照上表所述进行初始化,但以下情况除外:struct 包含位字段、union 没有 pointer 或 float 字段,或者数组类型无法进行完整的初始化。这些例外情况将使用用于 double 类型的局部变量的值进行初始化。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分。其主要用途是覆盖 -xtarget 选项提供的值。
此选项通过指定目标处理器来指定计时属性。其部分影响表现在以下方面:
指令的顺序,即调度
编译器使用分支的方法
语义上等价的其他指令可用时使用的指令
下表列出了 SPARC 平台的 c 的 -xchip 值:
表 B-22 SPARC -xchip 标志
|
下表列出了用于 x86 平台的 -xchip 值:
表 B-23 x86 -xchip 标志
|
注 - 应通过指定 -xcode=pic13 或 -xcode=pic32 生成共享对象。尽管您可以通过 -m64 -xcode=abs64 生成可工作的共享对象,但这些对象的效率将会很低。使用 -m64, -xcode=abs32 或 -m64, -xcode=abs44 生成的共享对象将不起作用。
下表列出了 v 的值。
表 B-24 -xcode 标志
|
对于 32 位体系结构,缺省值是 -xcode=abs32。64 位体系结构的缺省值是 -xcode=abs44。
生成共享动态库时,缺省 -xcode 值 abs44 和 abs32 将与 64 位体系结构一起使用。但指定 -xcode=pic13 或 -xcode=pic32。在 SPARC 上使用 -xcode=pic13 和 -xcode=pic32 时的两项名义性能开销为:
用 –xcode=pic13 或 –xcode=pic32 编译的例程会在入口点执行一些附加指令,以将寄存器设置为指向用于访问共享库的全局变量或静态变量的表 (_GLOBAL_OFFSET_TABLE_)。
对全局或静态变量的每次访问都会涉及通过 _GLOBAL_OFFSET_TABLE_ 的额外间接内存引用。如果编译包括 -xcode=pic32,则每个全局和静态内存引用中都会有两个附加指令。
在考虑这些开销时,请记住:由于受到库代码共享的影响,使用 -xcode=pic13 和 -xcode=pic32 会大大减少系统内存需求。共享库中使用 -xcode=pic13 或 -xcode=pic32 编译的每页代码都可以由使用该库的每个进程共享。如果共享库中的代码页包含非 pic(即绝对)内存引用,即使仅包含单个非 pic 内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本。
确定是否已经使用 -xcode=pic13 或 -xcode=pic32 编译 .o 文件的最简单方法是使用 nm 命令:
% nm file.o | grep _GLOBAL_OFFSET_TABLE_ U _GLOBAL_OFFSET_TABLE_
包含与位置无关的代码的 .o 文件将包含对 _GLOBAL_OFFSET_TABLE_ 无法解析的外部引用(用字母 U 标记)。
要确定是使用 -xcode=pic13 还是使用 -xcode=pic32,请使用 elfdump -c 检查全局偏移表 (Global Offset Table, GOT) 的大小并查找节标题 sh_name: .got。sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13。否则,请指定 -xcode=pic32。有关更多信息,请参见 elfdump(1) 手册页。
按照以下准则来确定应如何使用 -xcode:
如果要生成可执行文件,请勿使用 –xcode=pic13 或 -xcode=pic32。
如果要生成仅用于链接到可执行文件的归档库,请勿使用 -xcode=pic13 或 -xcode=pic32。
如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,再使用 -xcode=pic32。
如果要生成用于链接到共享库的归档库,请使用 -xcode=pic32。
已废弃,不使用。改用 -xipo。-xcrossfile 是 —xipo=1 的别名。
允许 C 编译器接受在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。这些语言环境包括 ja_JP.PCK。
处理此类语言环境所需的编译器转换阶段可能导致编译时间明显延长。仅当编译的源文件包含此类语言环境中某个语言环境的源代码字符时,才应该使用此选项。
除非指定 -xcsi,否则编译器不识别在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。
如果您维护会读取 DWARF 格式的调试信息的软件,请指定 -xdebugformat=dwarf。此选项会导致编译器使用 DWARF 标准格式生成调试信息,这是缺省设置。
表 B-25 -xdebugformat 标志
|
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。此选项需要一个参数。
此选项影响使用 -g 选项记录的数据的格式。即使在没有使用 -g 的情况下记录少量调试信息,此选项仍可控制其信息格式。因此,即使不使用 -g,-xdebugformat 也会有影响。
dbx 和性能分析器软件可识别 STABS 和 DWARF 格式,因此使用此选项对任何工具的功能都没有影响。
有关更多信息,请参见 dumpstabs(1) 和 dwarfdump(1) 手册页。
分析循环以了解迭代间数据依赖性并执行循环重构,包括循环交换、循环熔合以及标量替换。
对于所有优化级别 -xO3 以及更高级别,-xdepend 缺省为 -xdepend=on。指定 -xdepend 的显式设置会覆盖任何缺省设置。
指定不带参数的 -xdepend 等效于 -xdepend=yes。
依赖性分析在单处理器系统中可能很有用。但是,如果您在单处理器系统上使用 -xdepend,则不应同时指定 -xautopar,因为将针对多处理器系统执行 -xdepend 优化。
要查看宏在程序中如何工作时,请使用该选项。该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出信息输出到标准错误 (stderr)。-xdumpmacros 选项在整个文件中或在 dumpmacros 或 end_dumpmacros pragma 覆盖它之前都是有效的。请参见2.11.6 dumpmacros。
下表列出了 value 的有效参数。前缀 no% 可禁用关联的值。
表 B-26 -xdumpmacros 值
|
该选项的值会累积,因此指定 -xdumpmacros=sys -xdumpmacros=undefs 与 -xdumpmacros=undefs,sys 的效果相同。
注 - 子选项 loc、conds 和 sys 是 defs、undefs 和 use 选项的限定符。使用 loc、conds 和 sys 本身并不会生成任何结果。例如,使用 -xdumpmacros=loc,conds,sys 不会生成什么结果。
指定不带任何参数的 -xdumpmacros 缺省设置为 -xdumpmacros=defs,undefs,sys。未指定 -xdumpmacros 时的缺省值为 -xdumpmacros=%none。
如果使用选项 -xdumpmacros=use,no%loc,则使用的每个宏名称只输出一次。但是,如果要了解更多详细信息,请使用选项 -xdumpmacros=use,loc,这样每次使用宏时都会打印位置和宏名称。
例如以下文件 t.c:
example% cat t.c #ifdef FOO #undef FOO #define COMPUTE(a, b) a+b #else #define COMPUTE(a,b) a-b #endif int n = COMPUTE(5,2); int j = COMPUTE(7,1); #if COMPUTE(8,3) + NN + MM int k = 0; #endif
以下示例显示了使用 defs、undefs、sys 和 loc 参数时文件 t.c 的输出。
example% cc -c -xdumpmacros -DFOO t.c #define __SunOS_5_9 1 #define __SUNPRO_C 0x512 #define unix 1 #define sun 1 #define sparc 1 #define __sparc 1 #define __unix 1 #define __sun 1 #define __BUILTIN_VA_ARG_INCR 1 #define __SVR4 1 #define __SUNPRO_CC_COMPAT 5 #define __SUN_PREFETCH 1 #define FOO 1 #undef FOO #define COMPUTE(a, b) a + b example% cc -c -xdumpmacros=defs,undefs,loc -DFOO -UBAR t.c command line: #define __SunOS_5_9 1 command line: #define __SUNPRO_C 0x512 command line: #define unix 1 command line: #define sun 1 command line: #define sparc 1 command line: #define __sparc 1 command line: #define __unix 1 command line: #define __sun 1 command line: #define __BUILTIN_VA_ARG_INCR 1 command line: #define __SVR4 1 command line: #define __SUN_PREFETCH 1 command line: #define FOO 1 command line: #undef BAR t.c, line 2: #undef FOO t.c, line 3: #define COMPUTE(a, b) a + b
以下示例说明了 use、loc 和 conds 参数如何报告文件 t.c 中宏的行为:
example% cc -c -xdumpmacros=use t.c used macro COMPUTE example% cc -c -xdumpmacros=use,loc t.c t.c, line 7: used macro COMPUTE t.c, line 8: used macro COMPUTE example% cc -c -xdumpmacros=use,conds t.c used macro FOO used macro COMPUTE used macro NN used macro MM example% cc -c -xdumpmacros=use,conds,loc t.c t.c, line 1: used macro FOO t.c, line 7: used macro COMPUTE t.c, line 8: used macro COMPUTE t.c, line 9: used macro COMPUTE t.c, line 9: used macro NN t.c, line 9: used macro MM
例如文件 y.c:
example% cat y.c #define X 1 #define Y X #define Z Y int a = Z;
以下示例基于 y.c 中的宏显示了 -xdumpmacros=use,loc 的输出:
example% cc -c -xdumpmacros=use,loc y.c y.c, line 4: used macro Z y.c, line 4: used macro Y y.c, line 4: used macro X
Pragma dumpmacros/end_dumpmacros 会覆盖 -xdumpmacros 命令行选项的作用域。
该选项指示编译器将函数或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)可将这些段重新排序以优化程序性能。该优化在缺页时间构成程序运行时的一大部分时最有效。
对变量重新排序有助于解决对运行时性能产生负面影响的以下问题:
在内存中存放位置很近的无关变量会造成缓存和页的争用。
在内存中存放位置很远的相关变量会造成不必要的过大工作集。
未用到的弱变量副本会造成不必要的过大工作集,从而降低有效数据密度。
为优化性能而对变量和函数进行重新排序时,需要执行以下操作:
使用 -xF 进行编译和链接。
按照 Oracle Solaris Studio 性能分析器手册和《Oracle Solaris 链接程序和库指南》中有关为函数或数据生成映射文件的说明操作。
使用通过链接程序的 -M 选项生成的新映射文件重新链接。
在分析器下重新执行以验证是否增强。
下表列出了 v 的值。
表 B-27 -xF 值
|
在这些值(%all 和 %none 除外)前面添加 no% 可禁用子选项。例如 no%func。
如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func。
使用 -xF=lcldata 会限制某些地址计算优化,因此,只应在必要时才使用该标志。
请参见 analyzer(1) 和 ld(1) 手册页。
-xhelp=flags 显示编译器选项汇总信息。
如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用 -g 生成的符号信息结合)。它将分析数据与目标的数据空间而非指令空间进行关联,可以对行为进行深入洞察,单独通过指令分析难以做到这一点。
可使用 -xhwcprof 编译一组指定的目标文件。但是,-xhwcprof 在应用于应用程序中的所有目标文件时非常有用,可识别并关联分布在应用程序的目标文件中的所有内存引用。
如果在不同的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。-xhwcprof 的未来扩展可能需要在链接时使用它。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求启用优化并将调试数据的格式设置为 DWARF (-xdebugformat=dwarf)。
-xhwcprof 和 -g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof 和 -g 所引起的增加总量还多。
下列命令可编译 example.c,并可为硬件计数器分析以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:
example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c
有关基于硬件计数器的分析的更多信息,请参见 Oracle Solaris Studio 性能分析器手册。
用于 -xinline 的 list 的格式如下所示:[{%auto,func_name ,no%func_name}[,{%auto ,func_name,no%func_name}]...]
-xinline 尝试只内联可选列表中指定的函数。该列表可为空,或者包含由逗号分隔的 func_name、no% func_name> 或 %auto 列表,其中 func_name 是函数名称。-xinline 仅在 -xO3 或更高级别上起作用。
表 B-28 -xinline 标志
|
该列表值从左至右进行累积。对于 -xinline=%auto,no%foo 的规范,编译器将尝试内联除 foo 之外的所有函数。对于 -xinline=%bar,%myfunc,no%bar 的规范,编译器仅尝试内联 myfunc。
在优化级别为 -xO4 或更高级别上编译时,编译器通常尝试内联源文件中定义的对函数的所有引用。通过指定 -xinline 选项,您可以限定编译器试图内联的函数集。如果仅指定 -xinline= 而不指定任何函数或 %auto,则表示不内联源文件中的任何例程。如果您指定了 func_name 和 no%func_name 而未指定 %auto,则编译器将仅尝试内联列表中指定的函数。如果在优化级别设置为 -xO4 或更高时用 -xinline 选项在值列表中指定 %auto,编译器将尝试内联所有未被 no% func_name 显式排除的函数。
如果以下任何条件适用,则不内联函数。且不发出任何警告。
优化级别低于 -xO3。
无法找到例程。
优化器无法内联例程。
正编译的文件中不存在例程的源代码(但是,请参见 -xipo)。
如果在命令行指定多个 -xinline 选项,它们将不会累积。命令行上的最后一个 -xinline 指定编译器尝试内联的函数。
另请参见 -xldscope。
指定此选项编译并检测您的程序,以供线程分析器进行分析。有关线程分析器的更多详细信息,请参见 tha(1) 手册页。
然后可使用性能分析器以 collect -r races 来运行此检测过的程序,从而创建数据争用检测实验。如果您单独运行检测过的代码,其运行速度将非常缓慢。
可指定 -xinstrument=no%datarace 来关闭线程分析器的源代码准备。这是缺省值。
您必须为 -xinstrument= 指定参数。
如果在不同的步骤中进行编译和链接,则在编译和链接步骤都必须指定 -xinstrument=datarace。
此选项定义了预处理程序令牌 __THA_NOTIFY。可指定 #ifdef __THA_NOTIFY 来保护对 libtha(3) 例程的调用。
该选项也设置 -g。
用 0、1 或 2 替换 a。没有任何参数的 -xipo 等效于 -xipo=1。-xipo=0 是缺省设置,表示禁用 -xipo。在 -xipo=1 时,编译器会跨所有源文件执行内联。
在 -xipo=2 时,编译器执行过程间调用别名分析同时优化内存分配和布局,以提高缓存的性能。
编译器可通过调用过程间分析组件执行部分程序优化。它在链接步骤中跨所有目标文件执行优化,并且不限于编译命令的源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。
编译时和链接时都必须指定 -xipo。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的目标文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。在编译步骤中创建的目标文件具有在这些文件内编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
在编译和链接大型多文件应用程序时,-xipo 特别有用。用该标志编译的对象目标文件具有在这些文件内编译的分析信息,这些信息实现了在源代码和预编译的程序文件中的过程间分析。
分析和优化只限于使用 -xipo 编译的目标文件,并不扩展到目标文件或库。
-xipo 是多阶段的,因此如果要在不同的步骤中进行编译和链接,需要为每一步指定 -xipo。
关于 -xipo 的其他重要信息:
它要求优化级别最低为 -xO4。
编译时未使用 -xipo 的对象可以自由地与使用 -xipo 编译的对象链接。
在此例中,编译和链接在单个步骤中进行:
cc -xipo -xO4 -o prog part1.c part2.c part3.c
优化器在三个源文件之间执行交叉文件内联。此过程是在最终链接步骤中完成的,因此源文件的编译不必全部在单次编译中进行,可以分多次单独进行编译,且每次编译时都指定 -xipo。
在此例中,编译和链接在不同的步骤中进行:
cc -xipo -xO4 -c part1.c part2.c cc -xipo -xO4 -c part3.c cc -xipo -xO4 -o prog part1.o part2.o part3.o
即使使用 -xipo 进行编译,也存在库不参与跨文件过程间分析的限制,如以下示例所示:
cc -xipo -xO4 one.c two.c three.c ar -r mylib.a one.o two.o three.o ... cc -xipo -xO4 -o myprog main.c four.c mylib.a
在此示例中,过程间优化是在以下例程之间执行的:one.c、two.c 和 three.c 之间,main.c 和 four.c 之间,但不在 main.c 或 four.c 和 mylib.a 上的例程之间执行。(第一次编译可能会生成有关未定义符号的警告,但仍可执行过程间优化,因为它是一个编译和链接步骤。)
在链接步骤中使用目标文件集合时,编译器试图执行整个程序分析和优化。对于该目标文件集合中定义的任何函数或子例程 foo(),编译器做出以下两个假定:
foo() 无法在运行时被在该目标文件集合之外定义的其他例程显式调用。
来自该目标文件集合中的任何例程的 foo() 调用将不受在该目标文件集合以外定义的不同版本的 foo() 的干预。
如果假定 2 不成立,请不要使用 -xipo=1 或 -xipo=2 进行编译。
例如,如果对函数 malloc() 创建了您自己的版本,并使用 -xipo=2 进行编译。这样,对于任何库中引用 malloc() 且与您的代码链接的所有函数,都必须使用 -xipo=2 进行编译,并且需要在链接步骤中对其目标文件进行操作。由于此过程对于系统库不大可能,因此不要使用 -xipo=2 编译您的 malloc 版本。
另举一例,如果生成了一个共享库,有两个外部调用(foo() 和 bar())分别在两个不同的源文件中。并假设 bar() 调用 foo()。如果可在运行时插入 foo(),则不要使用 -xipo=1 或 -xipo=2 编译 foo() 或 bar() 的源文件。否则,foo() 会内联到 bar() 中,从而导致出现错误的结果。
-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的目标文件来优化传递给链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为其优化后的版本。
下表列出了 a 的值。
表 B-29 -xipo_archive 标志
|
如果不为 -xipo_archive 指定设置,编译器会将其设置为 -xipo_archive=none。
您必须为 -xipo_archive= 指定值。
禁用或设置 #pragma ivdep pragma 的解释(忽略向量依赖性)。
ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这将使编译器能够执行各种循环优化(例如微向量化、分发、软件流水线等),而以其他方式可能无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。
#pragma ivdep 指令的解释依赖于 —xivdep 选项的值。
以下列表列出了 p 的值及其含义。
忽略假定的循环附带依赖性
忽略所有循环附带向量依赖性
忽略假定的向后循环附带向量依赖性
忽略所有向后循环附带向量依赖性
不忽略任何依赖性(禁用 ivdep pragma)
提供这些解释是为了与另一个供应商对 ivdep pragma 的解释兼容。
指定 -xjobs 选项可设置编译器为完成工作需要创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。目前,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。
通常,n 的安全值等于 1.5 乘以可用处理器数。如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。
指定 -xjobs 时务必要指定值。否则,将会发出错误诊断并使编译停止。
出现最合适的实例之前,-xjobs 的多重实例在命令行上会互相覆盖。
以下示例在有两个处理器的系统上进行的编译,速度比使用相同命令但没有 -xjobs 选项时进行的编译快。
example% cc -xipo -xO4 -xjobs=3 t1.c t2.c t3.c
您必须为 -xipo_archive= 指定值。
禁止对命名函数 ( name) 进行与堆栈相关的优化。
禁止对所有代码进行与堆栈相关的优化。
允许对所有代码进行与堆栈相关的优化。
此选项是累积性的,可以多次出现在命令行中。例如,—xkeepframe=%all —xkeepframe=no%func1 表示应保留 func1 以外的所有函数的堆栈帧。而且,—xkeepframe 优先于 —xregs=frameptr。例如,—xkeepframe=%all —xregs=frameptr 表示应保留所有函数的堆栈,但会忽略 —xregs=frameptr 的优化。
如果命令行中未指定,编译器将采用 -xkeepframe=%none 作为缺省值。如果指定了但没有值,编译器将采用 -xkeepframe=%all
指定 -xldscope 选项,以更改用于外部符号定义的缺省链接程序作用域。由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。
v 必须是下列值之一:
表 B-30 -xldscope 标志
|
如果未指定 -xldscope,编译器将假定 -xldscope=global。如果指定不带参数的 -xldscope,编译器会发出错误信息。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。
如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。编译器在以下情况下会内联函数:
使用 -xinline 指定函数名称。
在 -xO4 或更高级别进行编译(在这种情况下可能会自动进行内联)。
使用内联说明符。
使用内联 pragma。
使用跨文件优化。
例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:
void* ABC_allocator(size_t size) { return malloc(size); }
如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库用户尝试用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。
生成库时,用 __hidden 或 __symbolic 说明符声明的库函数可以内联生成。假定这些函数不被用户覆盖。有关更多信息,请参见2.2 链接程序作用域说明符。
用 __global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。
另请参见 -xinline、-xO、-xipo、#pragma、inline。
强制为异常类中的数学例程返回 IEEE 754 样式的值。在此情况下,不输出异常消息,并且不应依赖 errno。
内联一些库例程,以加快执行速度。此选项可为浮点选项和系统平台选择合适的汇编语言内联模板。
无论将函数的任何规范作为 -xlibmil 标记的一部分,-xlibmil 都会内联函数。
但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请尽量不要使用此选项。另请参见2.13 保留 errno 的值。
使编译器可以使用优化数学例程的库。使用此选项时,必须通过指定 -fround=nearest 来使用缺省舍入模式。
数学例程库优化了性能,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。
请注意,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。有关更多信息,请参见2.13 保留 errno 的值。
该库选项在命令行上的顺序并不重要。
此选项由 -fast 选项设置。
(已废弃)使用 -library=sunperf 可与 Sun 性能库链接。
编译器忽略此选项且不显示任何提示。
(SPARC) 指示编译器对可重定位的目标文件执行链接时优化。这些优化在链接时通过分析二进制目标代码来执行。虽然未重写目标文件,但生成的可执行代码可能与初始目标代码不同。
必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制目标文件执行部分受限的优化。
-xlinkopt 优化出现在编译器命令行上的静态库代码,但会跳过出现在命令行上的共享(动态)库代码而不对其进行优化。您还可以在生成共享库(用 -G 编译)时使用 -xlinkopt。
级别设置执行的优化级别,必须为 0、1 或 2。下表列出了优化级别:
表 B-31 -xlinkopt 标志
|
如果在不同的步骤中编译,-xbinopt 必须同时出现在编译和链接步骤中。
example% cc -c -xlinkopt a.c b.c example% cc -o myprog -xlinkopt=2 a.o
有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
请注意,仅当编译器链接时才使用级别参数。在该示例中,即使二进制目标代码是用隐含级别 1 编译的,使用的后优化级别仍然是 2。
指定 -xlinkopt 时若不带级别参数,则表示 -xlinkopt=1。
当编译整个程序并且使用分析反馈时,该选项才最有效。分析会显示代码中最常用和最不常用的部分,并且生成操作会指示优化器相应地进行处理。此选项对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。通常,请按如下所示使用此选项:
example% cc -o progt -xO5 -xprofile=collect:prog file.c example% progt example% cc -o prog -xO5 -xprofile=use:prog -xlinkopt file.c
有关使用分析反馈的详细信息,请参见B.2.144 -xprofile= p。
使用 -xlinkopt 编译时,请不要使用 -zcombreloc 链接程序选项。
注意,使用该选项编译会略微延长链接的时间,目标文件的大小也会增加,但可执行文件的大小保持不变。使用 -xlinkopt 和 -g 编译会将调试信息包括在内,从而增加了可执行文件的大小。
显示哪些循环已并行化。提供未并行化循环的简要原因。仅当指定了 -xautopar 时,-xloopinfo 选项才有效,否则,编译器将发出警告。
要达到更快的执行速度,则该选项需要多处理器系统。在单处理器系统中,生成的代码通常运行得较慢。
只对指定的 C 程序运行 C 预处理程序,同时请求预处理程序生成 makefile 依赖性并将结果发送至标准输出。有关 make 文件和依赖性的详细信息,请参见 make(1) 手册页。
例如:
#include <unistd.h> void main(void) {}
生成的输出如下:
e.o: e.c e.o: /usr/include/unistd.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/machtypes.h e.o: /usr/include/sys/select.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/types.h e.o: /usr/include/sys/time.h e.o: /usr/include/sys/unistd.h
如果您指定 -xM 和 -xMF,则编译器会将所有 makefile 依赖性信息追加到使用 -xMF 指定的文件中。
生成 makefile 依赖性类似 -xM,但不包括 /usr/include 文件。例如:
more hello.c #include<stdio.h> main() { (void)printf(“hello\n”); } cc– xM hello.c hello.o: hello.c hello.o: /usr/include/stdio.h
使用 -xM1 编译不会报告头文件的依赖性:
cc– xM1 hello.c hello.o: hello.c
-xM1 在 -Xs 模式下不可用。
如果您指定 -xM1 和 -xMF,则编译器会将所有 makefile 依赖性信息附加至使用 -xMF 指定的文件中。
像 -xM 一样生成 makefile 依赖性,但编译继续。-xMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .d 的 filename。如果指定 -xMD 和 -xMF,预处理程序会将所有 makefile 依赖性信息写入到使用 -xMF 指定的文件中。不允许使用 -xMD -xMF 或 -xMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
使用此选项可为 makefile 依赖性输出指定一个文件。您无法在一个命令行上使用 -xMF 为多个输入文件指定单独的 filename。不允许使用 -xMD -xMF 或 -xMMD -xMF 编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
使用此选项可生成不包括系统头文件的 makefile 依赖性。此选项与 -xM1 提供的功能相同,但是编译继续。-xMMD 为从 -o 输出 filename(如果指定)或输入源 filename 派生的 makefile 依赖性信息生成一个输出文件,并替换(或添加)后缀为 .d 的 filename。如果您指定 -xMF,则编译器将改用您提供的文件名。不允许使用 -xMMD -xMF 或 -xMMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
将数据段合并为文本段。在此编译所生成的目标文件中初始化的数据是只读数据,并可(除非用 ld-N 链接)在进程间共享。
三个选项 -xMerge -ztext -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
此选项可将 pragma opt 的级别限制为指定级别。v 为 off、1、2、3、4、5 之一。缺省值为 -xmaxopt=off ,表示忽略 pragma opt。指定未提供参数的 -xmaxopt 等效于指定 -xmaxopt=5。
如果同时指定了 -xO 和 -xmaxopt,则使用 -xO 设置的优化级别不得超过 -xmaxopt 值。
(SPARC) 使用 -xmemalign 选项可控制编译器对数据对齐所做的假定。通过控制因可能出现的未对齐内存访问而生成的代码以及出现未对齐内存访问时的程序行为,可以更轻松地将代码移植到 SPARC 平台。
指定最大假定内存对齐和未对齐数据访问行为。您必须同时为 a(对齐)和 b(行为)提供值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。下表列出了 -xmemalign 的对齐值和行为值。
表 B-32 -xmemalign 对齐和行为标志
|
如果要链接到某个已编译的目标文件,并且编译该目标文件时 b 的值设置为 i 或 f,就必须指定 -xmemalign。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。-xmemalign 选项允许您在这些情况下指定编译器要假定的数据最大内存对齐。它还指定在运行时发生未对齐内存访问时要执行的错误行为。
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应是
操作系统将陷阱转换为 SIGBUS 信号。如果程序无法捕捉到信号,则程序将会停止。即使程序捕捉到信号,未对齐的访问尝试仍将无法成功。
操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱。
以下缺省值仅适用于未使用 -xmemalign 选项时:
-xmemalgin=8i(对于所有 32 位平台 (-m32))。
-xmemalign=8s(对于所有 64 位平台 (-m64))。
对于所有平台,使用了 -xmemalign 选项但未提供值时的缺省值为 -xmemalign=1i。
下表介绍了如何使用 -xmemalign 来处理不同的对齐情况。
表 B-33 -xmemalign 示例
|
(x86) -xmodel 选项使编译器可针对 Oracle Solaris x86 平台修改 64 位对象的格式;只应为此类对象的编译指定该选项。
仅当启用了 64 位的 x64 处理器上还指定了 -m64 时,该选项才有效。
下表列出了 a 的值。
表 B-34 -xmodel 标志
|
此选项不累积,因此编译器根据命令行最右侧的 -xmodel 实例设置模型值。
如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。
您不必使用此选项编译所有转换单元。只有可以确保访问的对象在可访问范围之内,才可编译选择的文件。
请注意,并非所有 Linux 系统都支持中等模型。
缺省情况下不链接任何库;即不向 ld(1) 传递任何 -l 选项。通常,cc 驱动程序将 -lc 传递给 ld。
在您使用 -xnolib 时,必须自己传递所有 -l 选项。
不内联数学库例程。例如,在 –fast 选项后面使用该选项:
% cc– fast– xnolibmil....
通过禁用以前指定的所有 -xlibmopt 选项,禁止编译器使用优化的数学库。例如,在 -fast 后面使用该选项,这将启用 -xlibmopt。
% cc -fast -xnolibmopt ...
不将共享库的运行时搜索路径生成到可执行文件中。
建议用该选项生成提交到客户(这些客户的程序使用的共享库可能具有不同路径)的可执行文件。
设置编译器优化级别。请注意,大写字母 O 后跟数字 1、2、3、4 或 5。一般说来,优化级别越高,运行时性能越好。不过,较高的优化级别会延长编译时间并生成较大的可执行文件。
在少数情况下,-xO2 级别的性能可能比其他优化级别好,而 -xO3 也可能胜过 -xO4。
如果优化器内存不足,它将尝试通过在较低的优化级别中重试当前的过程来进行恢复,并以命令行选项中指定的原始级别继续后续过程。
缺省为不优化,但只有不指定优化级别时才可能使用缺省设置。如果您指定优化级别,则无法禁用优化。
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会发出优化已设置的警告消息。不使用任何优化来编译的唯一方法是从指定优化级别的命令行或 makefile 删除所有选项。
如果使用 -g 并且优化级别为 -xO3 或更低,编译器将提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。
如果使用 -g 并且优化级别为 -xO4 或更高,编译器将提供进行全面优化的最佳效果符号信息。
使用 -g 进行调试不会抑制 -xOn,但 -xOn 会在某些方面限制 -g。例如,优化选项会降低调试的效用,以致您无法显示 dbx 中的变量,但您仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见《使用 dbx 调试程序》第 1 章中的“调试优化的代码”。
如果同时指定了 -xO 和 -xmaxopt,那么用 -xO 设置的优化级别不得超过 -xmaxopt 值。
如果在 -xO3 或 -xO4 级别上优化非常大的程序(在同一程序中有数千行代码),优化器可能需要大量虚拟内存。在此类情况下,机器性能可能会降低。
下表列出了 SPARC 平台上的优化级别。
表 B-35 SPARC 平台上的 -xO 标志
|
下表列出了 x86 平台上的优化级别。
表 B-36 x86 平台上的 -xO 标志
|
有关调试的更多信息,请参见《《Oracle Solaris Studio:使用 dbx 调试程序》》手册。有关优化的更多信息,请参见 《Oracle Solaris Studio 性能分析器》手册。
另请参见 -xldscope 和 -xmaxopt。
使用 -xopenmp 选项可通过 OpenMP 指令启用显式并行化。要在多线程环境中运行已并行化的程序,必须在执行之前将环境变量 OMP_NUM_THREADS 设置为大于 1 的值。如果未设置,则缺省值为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,应将 OMP_NUM_THREADS 设置为正在运行的系统中的可用虚拟处理器数,该值可使用 Oracle Solaris psrinfo(1) 命令确定。
要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。缺省情况下,禁用嵌套并行操作。
下表列出了 i 的值。
表 B-37 -xopenmp 标志
|
如果指定了 -xopenmp 但未给定值,编译器将假定 -xopenmp=parallel。如果不指定 -xopenmp,编译器将假定 -xopenmp=none。
如果使用 dbx 调试 OpenMP 程序,那么编译时选用 -g 和 -xopenmp=noopt 可以在并行区设置断点并显示变量内容。
在以后的发行版中,-xopenmp 的缺省值可能会更改。可以通过显式指定适当的优化来避免警告消息。
如果在生成任何 .so 库时使用 -xopenmp,则必须在链接可执行文件时使用 -xopenmp。可执行文件的编译器的版本不得比使用 -xopenmp 生成 .so 库的编译器的版本低。此要求在编译包含 OpenMP 指令的库时尤其重要。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
为了取得最佳的性能,请确保在系统上安装了最新的 OpenMP 运行时库 libmtsk.so。
有关特定于 OpenMP 的 C 实现的更多信息,请参见3.2 OpenMP 并行化。
有关 OpenMP 的信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
编译器对源文件仅执行语法和语义检查,以输出所有 K&R C 函数的原型。此选项不生成任何目标代码或可执行代码。例如,对以下源文件指定 -xP,
f() { } main(argc,argv) int argc; char *argv[]; { }
产生以下输出:
int f(void); int main(int, char **);
SPARC:有效值如下:4k、8K、64K、512K、2M、4M、32M、256M、2G、16G 或 default。
x86:有效值如下:4K、2M、4M、1G 或 default。
如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。必须指定适于目标平台的有效页面大小。
在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。
除非在编译和链接时使用,否则 -xpagesize 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
如果指定 -xpagesize=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
此选项是用于 -xpagesize_heap 和 -xpagesize_stack 的宏。这两个选项与 -xpagesize 接受相同的参数。可以通过指定 -xpagesize 为这两个选项设置相同的值,也可以分别为它们指定不同的值。
此选项与 -xpagesize 接受相同的值。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。
如果指定 -xpagesize_heap=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
除非在编译和链接时使用,否则 -xpagesize_heap 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
此选项与 -xpagesize 接受相同的值。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
在 Oracle Solaris 操作系统中使用 getpagesize(3C) 命令可以确定页面中的字节数。Oracle Solaris 操作系统不保证支持页面大小请求。可以使用 pmap(1) 或 meminfo(2) 来确定目标平台的页面大小。
如果指定 -xpagesize_stack=default,Oracle Solaris 操作系统将设置页面大小。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见相关的 Oracle Solaris 手册页。
除非在编译和链接时使用,否则 -xpagesize_stack 选项不会生效。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A-2。
此编译器选项可激活预编译头文件功能。v 可以是 auto、autofirst、collect: pch_filename 或 use:pch_filename。要使用该功能,需要指定 -xpch 和 -xpchstop 选项,并使用 #pragma hdrstop 指令。
使用 -xpch 选项可以创建预编译头文件并减少编译时间。预编译头文件可减少源文件共享一组通用的 include 文件(包含大量源代码)的应用程序的编译时间。预编译头文件的工作机理是,首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者编译其他有同样头文件顺序的源文件时就可以使用这些收集到的信息。编译器收集的信息存储在预编译头文件中。
有关更多信息,请参见:
编译器可以通过两种方法之一自动生成预编译头文件。一种方法是让编译器从在源文件找到的第一个 include 文件创建预编译头文件。另一种方法是让编译器从在源文件中找到的 include 文件集合中选择,选择范围从第一个 include 文件开始,直到已经定义好的确定哪个 include 文件是最后一个的点结束。使用下表中所述标志之一可以确定编译器用于自动生成预编译头文件的方法。
表 B-38 -xpch 标志
|
要手动创建预编译头文件,请首先使用 -xpch,并指定 collect 模式。指定 -xpch=collect 的编译命令只能指定一个源文件。在以下示例中,-xpch 选项根据源文件 a.c 创建名为 myheader.cpch 的预编译头文件:
cc -xpch=collect:myheader a.c
有效的预编译头文件名总是带有后缀 .cpch。在指定 pch_filename 时,该后缀可以由您自己添加或由编译器添加。例如,如果指定 cc -xpch=collect:foo a.c,则预编译的头文件名为 foo.cpch。
如果编译器无法将预编译头文件与 -xpch=auto 和 -xpch=autofirst 结合使用,则会生成新的预编译头文件。如果编译器无法将预编译头文件与 -xpch=use 结合使用,则会发出警告并使用实际的头文件来完成编译。
您也可以通过指定 -xpch=use:pch_filename 来指示编译器使用特定的预编译头文件。您可以将 include 文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件。例如,在 use 模式下的命令可能为:cc -xpch=use:foo.cpch foo.c bar.c foobar.c。
如果以下条件都成立,则只应使用现有的预编译头文件。如果以下任一条件不成立,则应重新创建预编译头文件:
用于访问预编译头文件的编译器与创建预编译头文件的编译器相同。由某一版本的编译器创建的预编译头文件可能无法供其他版本的编译器使用。
除 -xpch 选项之外,用 -xpch=use 指定的编译器选项必须与创建预编译头文件时指定的选项相匹配。
用 -xpch=use 指定的包含头文件的集合与创建预编译头文件时指定的头文件集合是相同的。
用 -xpch=use 指定的包含头文件的内容与创建预编译头文件时指定的包含头文件的内容是相同的。
当前目录(即发生编译并尝试使用给定预编译头文件的目录)与创建预编译头文件所在的目录相同。
在用 -xpch=collect 指定的文件中预处理指令(包括 #include)的初始序列,与在用 -xpch=use 指定的文件中预处理指令的序列相同。
要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的 include 文件(按其初始标记序列)。标记是指关键字、名称或标点符号。被 #if 指令排除的注释和代码不能被编译器识别为标记。该初始标记序列称为活前缀。也就是说,活前缀是源文件中通用于所有源文件的最靠前的部分。创建预编译头文件并进而确定源文件中哪些头文件是预编译的时,编译器使用此活前缀作为整个操作的依据。
编译器在当前编译期间找到的活前缀必须与用于创建预编译头文件的活前缀匹配。也就是说,必须在使用相同预编译头文件的所有源文件中对活前缀给出一致的解释。
源文件的活前缀只能包含注释和以下任意预处理程序指令:
#include #if/ifdef/ifndef/else/elif/endif #define/undef #ident (if identical, passed through as is) #pragma (if identical)
以上任何指令都可以引用宏。#else、#elif 和 #endif 指令必须在活前缀内匹配。注释被忽略。
指定 -xpch=auto 或 -xpch=autofirst 时,编译器会自动确定活前缀的终点。其定义如下。
第一个声明/定义
第一个 #line 指令
#pragma hdrstop 指令
在指定的 include 文件之后(如果您指定 -xpch=auto 和 -xpchstop)
第一个 include 文件(如果您指定 -xpch=autofirst)
注 - 预处理程序条件编译语句中的终点会生成一个警告,并禁止自动创建预编译头文件。另外,如果同时指定 #pragma hdrstop 和 -xpchstop 选项,编译器将使用两个停止点中较早的那一个来终止活前缀。
对于 -xpch=collect 或 -xpch=use,活前缀以 #pragma hdrstop 结尾。
在共享预编译头文件的每个文件的活前缀中,每个相应的 #define 和 #undef 指令都必须引用相同的符号。例如,每个 #define 必须引用同一个值。这些指令在每个活前缀中出现的顺序也必须相同。每个相应 pragma 也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中。
当头文件在不同源文件中的解释一致(特别是在仅包含完整声明时),则头文件是可预编译的。也就是说,任何一个文件中的声明都必须独自成为有效声明。不完全的类型声明,例如 struct S;,是有效声明。完全类型声明可以出现在某些其他文件中。请考虑这些头文件示例:
file a.h struct S { #include "x.h" /* not allowed */ }; file b.h struct T; // ok, complete declaration struct S { int i; [end of file, continued in another file] /* not allowed*/
并入预编译头文件的头文件不得违反以下约束。这里没有定义对违反上述约束的程序的编译结果。
头文件不得使用 __DATE__ 和 __TIME__。
头文件不得包含 #pragma hdrstop。
如果头文件还包含变量和函数定义,则也是可预编译的。
编译器自动创建预编译头文件时,会将该文件写入 SunWS_cache 目录中。此目录始终位于创建目标文件的位置。该文件的更新受锁保护,这样可在 dmake 下正常工作。
如果需要强制编译器重新生成自动生成的预编译头文件,可以使用 CCadmin 工具清除预编译头文件高速缓存目录。有关更多信息,请参见 CCadmin(1) 手册页。
不要在命令行上指定冲突的 -xpch 标志。例如,同时指定 -xpch=collect 和 -xpch=auto 或同时指定 -xpch=autofirst 和 -xpchstop=<include> 会产生错误。
如果指定 -xpch=autofirst,或指定不带 -xpchstop 的 -xpch=auto,则出现在第一个 include 文件之前或出现在使用用于 -xpch=auto 的 -xpchstop 指定的 include 文件之前的任何声明、定义或 #line 指令都会生成警告,并禁止自动生成预编译头文件。
-xpch=autofirst 或 -xpch=auto 时的第一个 include 文件之前的 #pragma hdrstop 会禁止自动生成预编译头文件。
指定 -xpch=collect 时,编译器会生成预编译头文件的依赖性信息。需要在 make 文件中创建适当的规则,以利用这些依赖性。考虑下面的 make 文件示例:
%.o : %.c shared.cpch $(CC) -xpch=use:shared -xpchstop=foo.h -c $< default : a.out foo.o + shared.cpch : foo.c $(CC) -xpch=collect:shared -xpchstop=foo.h foo.c -c a.out : foo.o bar.o foobar.o $(CC) foo.o bar.o foobar.o clean : rm -f *.o shared.cpch .make.state a.out
这些 make 规则以及编译器生成的依赖性,会在与 -xpch=collect 一起使用的任何源文件或属于预编译头文件的一部分的任何头文件发生更改时,强制重新创建手动创建的预编译头文件。此约束可防止使用过期的预编译头文件。
您无需在 make 文件中为 -xpch=auto 或 -xpch=autofirst 创建任何其他 make 规则。
使用 -xpchstop=file 选项可为预编译头文件指定活前缀的最后一个 include 文件。在命令行使用 -xpchstop 与将 hdrstop pragma 置于第一个包含指令之后等效,此包含指令在您使用 cc 命令指定的每个源文件中引用 file。
结合使用 -xpchstop=<include> 和 -xpch-auto 可以创建基于从其往上并包括 <include> 的头文件的预编译头文件。此标志覆盖缺省的 -xpch=auto 行为(使用整个活前缀中包含的所有头文件的行为)。
在以下示例中,-xpchstop 选项指定了预编译头文件的活前缀以 projectheader.h 的包含结束。因此,privateheader.h 不是活前缀的一部分。
example% cat a.c #include <stdio.h> #include <strings.h> #include "projectheader.h" #include "privateheader.h" . . . example% cc -xpch=collect:foo.cpch a.c -xpchstop=projectheader.h -c
另请参见 -xpch。
(仅限 Solaris)生成可移植的可执行代码 (Portable Executable Code, PEC) 二进制文件。此选项将程序中间表示置于目标文件和二进制文件中。该二进制文件可在以后用于调整和故障排除。
使用 -xpec 生成的二进制文件通常比未使用 -xpec 生成的文件大五倍到十倍。
如果不指定 -xpec,则编译器假定 -xpec=no。如果指定了 -xpec 但未提供标志,则编译器假定 -xpec=yes。
准备目标代码,以收集用 gprof(1) 进行分析所需的数据。此选项调用在正常终止情况下产生 gmon.out 文件的运行时记录机制。
注 - —xpg 在与 -xprofile 配合使用时不会提供任何其他帮助。这两个选项不会准备或使用对方提供的数据。
在 64 位 Oracle Solaris 平台上,使用 prof(1) 或 gprof(1) 生成分析,在 32 位 Oracle Solaris 平台上,则只使用 gprof 生成分析;分析中包含大概的用户 CPU 时间,这些时间源自(链接可执行文件时指定为链接程序参数的)主可执行文件中的例程以及共享库中的例程的 PC 示例数据(请参见 pcsample(2))。其他共享库(在进程启动后使用 dlopen(3DL) 打开的库)不进行分析。
在 32 位 Oracle Solaris 系统中,使用 prof(1) 生成的分析仅限于可执行文件中的例程。通过使用 -xpg 链接可执行文件并使用 gprof(1),可以对 32 位共享库进行分析。
在 x86 系统中,-xpg 与 -xregs=frameptr 不兼容。这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr。在将 -fast 与 -xpg 配合使用时,应使用 -fast -xregs=no%frameptr -xpg 进行编译。
当前的 Oracle Solaris 发行版不包括使用 -p 编译的系统库。因此,在当前 Solaris 平台上收集的分析不包含系统库例程的调用计数。
如果在编译时指定 -xpg,则还必须在链接时指定它。有关在编译时和链接时都必须指定的选项的完整列表,请参见A.1.2 编译时选项和链接时选项。
注 - 使用 -xpg 编译以便进行 gprof 分析的二进制文件不应与 binopt(1) 一起使用,因为它们不兼容并可能导致内部错误。
显式预取只应在度量支持的特殊环境下使用。
下表列出了 val 的值。
表 B-39 -xprefetch 标志
|
缺省值为 -xprefetch=auto,explicit。此缺省值会对实质上具有非线性内存访问模式的应用程序造成负面影响。要覆盖该缺省值,请指定 -xprefetch=no%auto,no%explicit。
sun_prefetch.h 头文件提供了可用来指定显式预取指令的宏。预取的位置大约为可执行文件中对应于宏出现的位置。
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。
该因子必须是形式为 n.n. 的正数。
在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。
编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加值,请使用大于 1 的因子。介于 .5 和 2.0 之间的值最有可能提供最佳性能。
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小此值,请使用小于 1 的因子。
要使用 latx:factor 子选项,则以接近 1.0 的因子值开始并对应用程序进行性能测试。适当增加或减小该因子,然后再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几个增量中将看不到性能差异,之后会突然出现差异,然后性能再趋于稳定。
a 的值为 [no%]indirect_array_access。
使用 -xprefetch_auto_type=indirect_array_access,可以允许编译器通过为直接内存访问生成预取的方式为选项 -xprefetch_level 指示的循环生成间接预取。
如果不指定 -xprefetch_auto_type 的设置,编译器会将其设置为 -xprefetch_auto_type=no%indirect_array_access。
类似 -xalias_level 的选项可以影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而发生的自动插入间接预取的主动性。
使用 -xprefetch_level 选项,可以控制自动插入通过 -xprefetch=auto 确定的预取指令的主动性。l 必须为 1、2 或 3。编译器将变得更加主动,换句话说,它会引入更多更高 -xprefetch_level 级别的预取。
适用于 -xprefetch_level 的值取决于应用程序具有的高速缓存未命中次数。较高级别的 -xprefetch_level 值具有提高应用程序性能的潜能。
仅当使用优化级别为 3 或更高的 -xprefetch=auto 进行编译时,此选项才有效;此选项可为支持预取的平台(v8plus、v8plusa、v9、v9a、v9b、generic64、native64)生成代码。
-xprefetch_level=1 启用预取指令自动生成。-xprefetch_level=2 启用级别 1 之外的额外生成。-xprefetch_level=3 启用级别 2 之外的额外生成。
指定了 -xprefetch=auto 时,缺省值为 -xprefetch_level=1。
p 必须为 collect[:profdir]、use[:profdir] 或 tcov[:profdir]。
此选项将会导致在执行期间收集并保存执行频率数据。在后续运行中,可以使用该数据来改进性能。对多线程应用程序来讲,分析收集 (Profile collection) 是一种安全的方法。也就是说,对执行其自己的多任务处理 (-mt) 的程序进行分析可产生准确的结果。只有指定 -xO2 或更高的优化级别时,此选项才有效。如果分别执行编译和链接,则链接步骤和编译步骤中必须都出现同一 -xprofile 选项。
在 -xprofile=use 时优化器收集并保存执行频率,以供将来使用。编译器生成可测量语句执行频率的代码。
-xMerge, -ztext, 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
分析目录名 profdir(如果指定)是包含已分析的目标代码的程序或共享库在执行时用来存储分析数据的目录路径名。如果 profdir 路径名不是绝对路径,在使用选项 -xprofile=use:profdir 编译程序时将相对于当前工作目录来解释该路径。
如果未使用 —xprofile=collect: prof_dir 或 —xprofile=tcov: prof_dir 指定分析目录名,分析数据将在运行时存储在名为 program.profile 的目录中,其中 program 是已分析的进程主程序的基本名称。在这种情况下,可以使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 控制在运行时存储分析数据的位置。如果已设置,分析数据将写入 $SUN_PROFDATA_DIR/$SUN_PROFDATA 指定的目录。如果在编译时指定了分析目录名,则 SUN_PROFDATA_DIR 和 SUN_PROFDATA 在运行时将无效。这些环境变量同样控制由 tcov 写入的分析数据文件的路径和名称,如 tcov(1) 手册页中所述。
如果未设置这些环境变量,分析数据将写入当前目录中的目录 profdir.profile,其中 profdir 是可执行文件的名称或在 -xprofile=collect: profdir 标志中指定的名称。如果 profdir 已在 .profile 中结束,-xprofile 不会将 .profile 附加到 profdir 中。如果多次运行程序,那么执行频率数据会累积在 profdir.profile 目录中;也就是说,以前执行的输出不会丢失。
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何目标文件也使用 -xprofile=collect 进行链接。
以下示例在生成程序所在目录的 myprof.profile 目录中收集分析数据,然后使用这些分析数据:
demo: cc -xprofile=collect:myprof.profile -xO5 prog.c -o prog demo: ./prog demo: cc -xprofile=use:myprof.profile -xO5 prog.c -o prog
以下示例在目录 /bench/myprof.profile 中收集分析数据,然后在优化级别为 -xO5 的反馈编译中使用收集的分析数据:
demo: cc -xprofile=collect:/bench/myprof.profile \ -xO5 prog.c -o prog ...run prog from multiple locations.. demo: cc -xprofile=use:/bench/myprof.profile \ -xO5 prog.c -o prog
通过从使用 —xprofile=collect[: profdir] 或 —xprofile=tcov[: profdir] 编译的代码中收集的执行频率数据,优化在执行已分析的代码时执行的工作。profdir 是一个目录的路径名,该目录包含运行用 —xprofile=collect[: profdir] 或 —xprofile=tcov[: profdir] 编译的程序所收集的分析数据。
要生成可供 tcov 和 —xprofile=use[:profdir] 使用的数据,必须在编译时通过选项 —xprofile=tcov[:profdir] 指定分析目录。必须在 —xprofile=tcov: profdir 和 —xprofile=use: profdir 中指定同一分析目录。为最大限度地减少混淆情况,请将 profdir 指定为绝对路径名。
profdir 路径名是可选的。如果未指定 profdir,将使用可执行二进制文件的名称。如果未指定 -o,将使用 a.out。如果未指定 profdir,编译器将查找 profdir.profile/feedback 或 a.out.profile/feedback。例如:
demo: cc -xprofile=collect -o myexe prog.c demo: cc -xprofile=use:myexe -xO5 -o myexe prog.c
程序是使用以前生成并保存在 feedback 文件中的执行频率数据优化的,此数据是先前执行用 -xprofile=collect 编译的程序时写入的。
除了 -xprofile 选项之外,源文件和其他编译器选项必须与用于编译(该编译过程创建了生成 feedback 文件的编译程序)的相应选项完全相同。编译器的相同版本必须同时用于 collect 生成和 use 生成。
如果用 -xprofile=collect:profdir 编译,则必须将相同的分析目录名 profdir 用在优化编译中:-xprofile=use: profdir。
另请参见 -xprofile_ircache,以了解有关加速 collect 阶段和 use 阶段之间的编译的说明。
如果指定可选的 profdir 参数,编译器将在指定位置创建分析目录。该分析目录中存储的数据可通过 tcov(1) 或由编译器通过 -xprofile=use:profdir 来使用。如果省略可选的 profdir 路径名,则会在执行已分析的程序时创建分析目录。只能通过 tcov(1) 使用该分析目录中存储的数据。使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 可以控制分析目录的位置。
如果 profdir 指定的位置不是绝对路径名,则编译时会相对于当前工作目录来解释该位置。
由 profdir 指定位置的目录必须在要执行已进行分析的程序的所有计算机中都可以访问。除非不再需要分析目录中的内容,否则不应删除该目录,因为除非重新编译,否则编译器存储在其中的数据将无法恢复。
示例 1:如果用 -xprofile=tcov:/test/profdata 编译一个或多个程序的目标文件,编译器会创建一个名为 /test/profdata.profile 的目录并将其用来存储描述已分析的目标文件的数据。该同一目录还可在执行时用来存储与已进行分析的目标文件关联的执行数据。
示例 2:如果名为 myprog 的程序用 -xprofile=tcov 编译并在目录 /home/joe 中执行,将在运行时创建目录 /home/joe/myprog.profile 并将其用来存储运行时分析数据。
(SPARC) 将 -xprofile_ircache[=path] 与 -xprofile=collect|use 一起使用,通过重用 collect 阶段保存的编译数据来缩短 use 阶段的编译时间。
在编译大程序时,由于中间数据的保存,使得 use 阶段的编译时间大大减少。注意,所保存的数据会占用相当大的磁盘空间。
在使用 -xprofile_ircache[=path] 时,path 会覆盖保存缓存文件的位置。缺省情况下,这些文件会作为目标文件保存在同一目录下。collect 和 use 阶段出现在两个不同目录中时,指定路径很有用。以下示例显示了典型的命令序列:
example% cc -xO5 -xprofile=collect -xprofile_ircache t1.c t2.c example% a.out // run collects feedback data example% cc -xO5 -xprofile=use -xprofile_ircache t1.c t2.c
(SPARC) 如果同时还指定 -xprofile=use 命令,请使用 -xprofile_pathmap=collect_prefix: use_prefix 选项。以下两个条件都成立且编译器无法找到使用 -xprofile=use 编译的目标文件的分析数据时,使用 -xprofile_pathmap。
使用 -xprofile=use 编译目标文件所在的目录与先前使用 -xprofile=collect 编译目标文件所在的目录不同。
目标文件在分析中共享公共基名,但可以根据它们在不同目录中的位置互相区分。
collect-prefix 是某个目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=collect 编译的。
use-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的目标文件是使用 -xprofile=use 编译的。
如果指定了 -xprofile_pathmap 的多个实例,编译器将按照这些实例的出现顺序对其进行处理。将 -xprofile_pathmap 实例指定的每个 use-prefix 与目标文件路径名进行比较,直至找到匹配的 use-prefix 或发现最后一个指定的 use-prefix 与目标文件路径名也不匹配。
在自动并行化期间启用约简识别。使用 -xreduction 进行编译需要 -xautopar,否则编译器将会发出警告。
当启用了约简识别时,编译器会并行化约简,例如点积以及最大或最小搜索。这些约简产生的舍入与通过非并行化代码获得的舍入不同。
r 是一个逗号分隔列表,它包含下面的一个或多个子选项:appl、float、frameptr。
用 no% 作为子选项的前缀会禁用该子选项。
请注意,-xregs 子选项仅限于特定的硬件平台。
示例:-xregs=appl,no%float
表 B-40 -xregs 子选项
|
SPARC 缺省值为 -xregs=appl,float。
x86 缺省值为 -xregs=no%frameptr。
在 x86 系统中,-xpg 与 -xregs=frameptr 不兼容。这两个选项不应一起使用。还请注意,-fast 中包括 -xregs=frameptr。
您应使用 -xregs=no%appl,float 编译用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要了解其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。
将赋值为指针的函数参数视为受限指针。f 为 %all、%none 或由下面的一个或多个函数名构成的逗号分隔列表:{%all|%none|fn[,fn...]。
如果使用此选项指定了函数列表,则指定函数中的指针参数将被视为受限指针。如果指定了 -xrestrict=%all,则整个 C 文件中的所有指针参数都将被视为受限指针。有关更多信息,请参阅3.7.2 受限指针。
此命令行选项可以单独使用,但最好将其用于优化。例如,以下命令将 prog.c 文件中的所有指针参数都视为受限指针:
%cc -xO3 -xrestrict=%all prog.c
以下命令将文件 prog.c 中的函数 agc 的所有指针参数都视为限定指针:
%cc -xO3 -xrestrict=agc prog.c
缺省值为 %none。指定 -xrestrict 与指定 -xrestrict=%all 等效。
该选项导致所有调试信息被复制到可执行程序中。该选项对 dbx 性能或程序的运行时性能影响很小,但会使用更多磁盘空间。
该选项允许在 SPARC V9 体系结构中使用无故障装入指令。
注 - 由于在发生诸如地址未对齐或段违规的故障时,无故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项。因为只有很少的程序会导致基于内存的陷阱,所以您可以安全地将该选项用于大多数程序。对于显式依赖基于内存的自陷来处理异常情况的程序,请勿使用该选项。
仅当与优化级别 -xO5 及以下 -xarch 值中的一个一起使用时,此选项才能有效:sparc、sparcvis、sparcvis2 或 sparcvis3(用于 -m32 和 -m64)。
将无后缀的浮点常量表示为单精度模式,而非缺省的双精度模式。与 -Xc 一起使用时无效。
示例: 如果编译器增加代码大小,它不会解开循环或并行化循环。
此选项已废弃,可能会在将来的发行版中删除。—xstrconst 是 —features=conststrings 的别名。
t 的值必须是下列值之一:native、generic、native64、generic64 或 system-name。
-xtarget 的每个特定值都会扩展到 -xarch、-xchip 和 -xcache 选项值的特定集合。使用 -xdryrun 选项可在运行的系统上确定 -xtarget=native 的扩展。
例如,-xtarget=ultra4 等效于 -xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2
注 - -xtarget 在特定主机平台上的扩展在该平台上编译时扩展到的 -xarch、-xchip 或 -xcache 设置可能与 -xtarget=native 不同。
表 B-41 -xtarget 值(所有平台)
|
通过为编译器提供目标计算机硬件的精确描述,某些程序的性能可得到提高。如果程序性能很关键,则合适的目标硬件规范可能非常重要,尤其是在较新版本的 SPARC 处理器上运行时。不过,对大多数程序和较旧的 SPARC 处理器来讲,性能的提高微不足道,因此指定 generic 就足够了。
在 SPARC 或 UltraSPARC V9 上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果为 -xtarget 指定 native64 或 generic64 以外的标志,则还必须按如下所示指定 -m64 选项:-xtarget=ultra... -m64。否则,编译器将使用 32 位内存模型。
表 B-42 SPARC 上的 -xtarget 扩展
|
在 64 位 x86 平台上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果为 -xtarget 指定 native64 或 generic64 以外的标志,则还必须按如下所示指定 -m64 选项:-xtarget=opteron ... -m64。否则,编译器将使用 32 位内存模型。
表 B-43 x86 上的 -xtarget 扩展
|
将 cc 使用的临时文件的目录设置为 dir。在此选项字符串中不允许有空格。如果不指定此选项,临时文件将保存到 /tmp。-xtemp 优先于 TMPDIR 环境变量。
指定 -xthreadvar 来控制线程局部变量的实现。将此选项与 __thread 声明说明符结合使用,可利用编译器的线程局部存储功能。使用 __thread 说明符声明线程变量后,请指定 -xthreadvar,以便能够将线程局部存储用于动态(共享)库中的位置相关的代码(非 PIC 代码)。有关如何使用 __thread 的更多信息,请参见2.3 线程局部存储说明符。
o 必须为 dynamic 或 no%dynamic。
表 B-44 -xthreadvar 标志
|
如果未指定 -xthreadvar,则编译器所用的缺省设置取决于是否启用与位置无关的代码。如果启用了与位置无关的代码,则该选项设置为 -xthreadvar=dynamic。如果禁用了与位置无关的代码,则该选项设置为 -xthreadvar=no%dynamic。
如果指定了 -xthreadvar 但未指定任何值,该选项将设置为 -xthreadvar=dynamic。
如果动态库包含与位置有关的代码,则必须指定 -xthreadvar。
链接程序不支持在动态库中与非 PIC 代码等效的线程变量。由于非 PIC 线程变量要快很多,因此应将其用作可执行文件的缺省设置。
另请参见 -xcode、-KPIC 和 -Kpic 的描述
针对 K&R C 与 Solaris ISO C 之间的差异发出警告。
-xtransition 选项与 -Xa 和 -Xt 选项一起使用时将发出警告。通过适当编码,可以消除关于不同行为的所有警告消息。除非使用 -xtransition 选项,否则不再出现以下警告:
\a is ISO C “alert” character
\x is ISO C hex escape
bad octal digit
base type is really type tag: name
comment is replaced by “##”
comment does not concatenate tokens
declaration introduces new type in ISO C: type tag
macro replacement within a character constant
macro replacement within a string literal
no macro replacement within a character constant
no macro replacement within a string literal
operand treated as unsigned
trigraph sequence replaced
ISO C treats constant as unsigned: operator
semantics of operator change in ISO C; use explicit cast
-xtrigraphs 选项确定编译器是否识别 ISO C 标准定义的三字符序列。
缺省情况下,编译器假定 -xtrigraphs=yes 并识别整个编译单元的所有三字符序列。
如果源代码具有包含问号 (?) 的文字串(编译器将其解释为三字母序列),那么您可以使用 -xtrigraph=no 子选项禁用对三字母序列的识别。-xtrigraphs=no 选项可禁用对整个编译单元内的所有三字母的识别。
请考虑以下名为 trigraphs_demo.c 的源文件示例。
#include <stdio.h> int main () { (void) printf("(\?\?) in a string appears as (??)\n"); return 0; }
以下示例显示了使用 -xtrigraphs=yes 编译此代码时的输出。
example% cc -xtrigraphs=yes trigraphs_demo.c example% a.out (??) in a string appears as (]
以下示例显示了使用 -xtrigraphs=no 编译此代码时的输出。
example% cc -xtrigraphs=no trigraphs_demo.c example% a.out (??) in a string appears as (??)
建议优化器解开循环 n 次。n 是正整数。n 为 1 时,要求编译器不要解开循环。当 n 大于 1 时,-xunroll=n 建议编译器根据需要解开循环 n 次。
如果您需要支持使用 ISO10646 UTF-16 文本字符串的国际化应用程序,请使用此选项。换句话说,如果代码中包含您希望在目标文件中由编译器转换成 UTF-16 字符串的文本字符串,请使用该选项。如果不指定此选项,编译器将既不生成、也不识别 16 位的文本字符串。此选项使编译器可以将 U"ASCII_string" 文本字符串识别成 unsigned short int 类型的数组。因为此类字符串还不属于任何标准,所以此选项启用对非标准 C 的识别。
通过指定 -xustr=no,可以关闭编译器识别 U"ASCII_string" 文本字符串。该选项在命令行上最右侧的实例覆盖了先前的所有实例。
缺省值为 -xustr=no。如果指定了没有参数的 -xustr,编译器将不接受该选项,而是发出一个警告。如果 C 或 C++ 标准定义了语法的含义,那么缺省设置是可以更改的。
可以指定 -xustr=ascii_utf16_ushort,而无需同时指定 U"ASCII_string" 文本字符串。
不是所有文件都必须使用该选项编译。
以下示例显示了前置有 U 的带引号文本字符串。此外,还显示了用于指定 -xustr 的命令行。
example% cat file.c const unsigned short *foo = U"foo"; const unsigned short bar[] = U"bar"; const unsigned short *fun() { return foo;} example% cc -xustr=ascii_utf16_ushort file.c -c
8 位字符文字可以带有 U 前缀,以形成一个 unsigned short 类型的 16 位 UTF-16 字符。示例:
const unsigned short x = U'x'; const unsigned short y = U'\x79';
在支持 SIMD 的 x86 处理器上允许自动生成向量库函数的调用或生成 SIMD(Single Instruction Multiple Data,单指令多数据)指令。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
下表列出了 a 的值。no% 前缀可禁用关联的子选项。
表 B-45 -xvector 标志
|
在 x86 平台上的缺省值为 -xvector=simd,在 SPARC 平台上的缺省值为 -xvector=%none。如果指定不带子选项的 -xvector,则在 x86 Solaris、SPARC Solaris 和 Linux 平台上,编译器将分别采用 -xvector=simd,lib、-xvector=lib 和 -xvector=simd。
-xvector 选项需要 -xO3 或更高的优化级别。如果优化级别未指定或低于 -xO3,编译将不会继续,同时会发出消息。
注 - 编译 x86 平台的 Oracle Solaris 内核代码时,应使用 -xvector=%none 进行编译。
在装入步骤中,编译器包含 libmvec 库。如果在不同的步骤中进行编译和链接,请对这两个命令使用相同的 -xvector 选项。
(SPARC) 在使用 vis.h 头文件生成 VIS 指令或使用汇编程序内联代码 (.il)(使用 VIS 指令)时,请使用 -xvis=[yes|no] 命令。缺省值为 -xvis=no。指定 -xvis 与指定 -xvis=yes 等效。
VIS 指令集是 SPARC v9 指令集的扩展。尽管 UltraSPARC 是 64 位处理器,但在很多情况下数据都限制在 8 位或 16 位范围内,特别是多媒体应用程序中。VIS 指令可以用一条指令处理 4 个 16 位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高。
发出有关可能存在的并行编程相关问题的警告,这些问题可能导致在使用 OpenMP 时出现错误的结果。与 -xopenmp 和 OpenMP API 指令一起使用。
编译器在检测到下列情形时会发出警告。
循环是使用 MP 指令并行化的,而这些指令中的不同循环迭代之间存在数据依赖性
OpenMP 数据共享属性子句存在问题。例如,声明在 OpenMP 并行区域中的访问可能导致数据争用的变量 "shared",或者声明其在并行区域中的值在并行区域之后使用的变量 "private"。
如果所有并行化指令在处理期间均未出现问题,则不显示警告。
示例:
cc -xopenmp -vpara any.c
注 - Oracle Solaris Studio 编译器支持 OpenMP API 并行化。因此,已废弃 MP pragma 指令,不再支持此类指令。有关迁移到 OpenMP API 的信息,请参见《OpenMP API 用户指南》。
指定新目录 dir 作为组件 c 的位置。c 可以包含任何字符,这些字符表示 -W 选项下列出的组件。
如果已指定组件的位置,则工具的新路径名称为 dir/tool。如果对任何一项应用了多个 -Y 选项,则保留最后一个选项。
指定用来搜索所有编译器组件的目录 dir。如果 dir 中找不到组件,搜索将转至安装编译器的目录。
(SPARC) 为 lock_lint 创建程序数据库,但不生成可执行代码。有关更多信息,请参阅 lock_lint(1) 手册页。