编译器命令行选项2.1.2--[no_]alternative_tokens此选项启用或禁用C和C++中备选标记的识别功能。缺省选项缺省选项是--alternative_tokens。用法在C和C++中,使用此选项可控制连字的识别。在C++中,使用此选项可控制运算符关键字(如and和bitand)的识别。2.1.3--[no_]anachronisms此选项启用或禁用C++中的过时特性。模式仅当源语言为C++时,此选项才有效。缺省选项缺省选项是--no_anachronisms。示例typedef enum [red, white, blue} tricolor;inline tricolor operator++(tricolor C, int)0int i = static_cast<int>(c) + 1;returnstatic_cast<tricolor>(i);3void foo(void)tricolor c = red;c++; // okay++c; // anachronism子如果使用--anachronisms选项编译此代码,则会生成一条警告消息。ARMDUI0348AC2-3版权所有2007ARMLimited。保留所有权利
编译器命令行选项 ARM DUI 0348AC 版权所有 © 2007 ARM Limited。保留所有权利。 2-3 2.1.2 -[no_]alternative_tokens 此选项启用或禁用 C 和 C++ 中备选标记的识别功能。 缺省选项 缺省选项是 -alternative_tokens。 用法 在 C 和 C++ 中,使用此选项可控制连字的识别。在 C++ 中,使用此选项可控制 运算符关键字(如 and 和 bitand)的识别。 2.1.3 -[no_]anachronisms 此选项启用或禁用 C++ 中的过时特性。 模式 仅当源语言为 C++ 时,此选项才有效。 缺省选项 缺省选项是 -no_anachronisms。 示例 typedef enum { red, white, blue } tricolor; inline tricolor operator++(tricolor c, int) { int i = static_cast<int>(c) + 1; return static_cast<tricolor>(i); } void foo(void) { tricolor c = red; c++; // okay ++c; // anachronism } 如果使用 -anachronisms 选项编译此代码,则会生成一条警告消息
编译器命令行选项如果在编译此代码时未使用--anachronisms选项,则会生成一条错误消息。另请参阅第2-15页的--cpp*第2-84页的--[no_]strict第2-85页的--strict_warnings第5-14页的过时功能2.1.4--apcs=qualifer...qualifier此选项控制生成代码时的交互操作和位置无关性。通过为--apcs命令行选项指定限定符,可以定义编译器所使用的《ARM体系结构的过程调用标准》(AAPCS)的变体。语法--apcs=qualifer...qualifier其中,qualifier...qualifier表示限定符的列表。该列表必须符合下列条件至少包含一个限定符其中的各限定符之间没有空格分隔。qualifier的每个实例必须为下列选项之一在支持或不支持ARM/Thumb"交互操作的情况下生成代ZInolinterwork码。缺省为/nointerwork。/[no]ropi允许或禁止生成只读且与位置无关(ROPI)的代码。缺省为/noropi./[no]pic是/[no]ropi的别名。/[no] rwpi允许或禁止生成读写且与位置无关(RWPI)的代码。缺省为/norwpi./[no]pid是/[no]rwpi的别名。/[no]fpic允许或禁止生成其相对地址引用与程序的加载位置无关的只读且与位置无关的代码。2-4ARMDUI0348AC版权所有2007ARMLimited。保留所有权利
编译器命令行选项 2-4 版权所有 © 2007 ARM Limited。保留所有权利。 ARM DUI 0348AC 如果在编译此代码时未使用 -anachronisms 选项,则会生成一条错误消息。 另请参阅 • 第2-15 页的- - cpp • 第2-84 页的- -[no_]strict • 第2-85 页的- -strict_warnings • 第5-14 页的过时功能 2.1.4 -apcs=qualifer.qualifier 此选项控制生成代码时的交互操作和位置无关性。 通过为 -apcs 命令行选项指定限定符,可以定义编译器所使用的《ARM 体系结 构的过程调用标准》(AAPCS) 的变体。 语法 -apcs=qualifer.qualifier 其中,qualifier.qualifier 表示限定符的列表。该列表必须符合下列条件: • 至少包含一个限定符 • 其中的各限定符之间没有空格分隔。 qualifier 的每个实例必须为下列选项之一: /[no]interwork 在支持或不支持 ARM/Thumb™ 交互操作的情况下生成代 码。缺省为 /nointerwork。 /[no]ropi 允许或禁止生成只读且与位置无关 (ROPI) 的代码。缺省为 /noropi。 /[no]pic 是 /[no]ropi 的别名。 /[no]rwpi 允许或禁止生成读写且与位置无关 (RWPI) 的代码。缺省为 /norwpi。 /[no]pid 是 /[no]rwpi 的别名。 /[no]fpic 允许或禁止生成其相对地址引用与程序的加载位置无关的只 读且与位置无关的代码
编译器命令行选项注意您也可以指定多个限定符。例如,--apcS=/nointenwork/noropi/norwpi与--apcs=/nointerwork--apcs=noropi/norwpi是等效的。缺省选项如果未指定--apcs选项,编译器将采用--apcs=/nointerwork/noropi/nonwpi。用法缺省情况下,按下列方式生成代码/Inolinterwork不支持交互操作(即/nointerwork),除非指定与体系结构ARMv5T或更高版本相对应的--cpu选项支持交互操作(即/interwork),适用于ARMv5T或更高版本。这是因为ARMv5T或更高版本直接支持交互操作。如果选择使用/ropi限定符生成ROPI代码,则编译器将执行/[no]ropi下列操作确定只读代码和与pc相关的数据的地址在只读输出节上设置与位置无关(PD属性注意在编译C++时,不支持--apcs=/ropi。如果选择使用/rwpi限定符生成RWPI代码,则编译器将执/[no] rwpi行下列操作使用相对于静态基址寄存器sb的偏移量确定可写数据的地址。这意味着可以在运行时固定RW数据区域的基址数据可具有多个实例数据可以是与位置无关的,但这并不是必需的在读写输出节上设置PI属性。ARMDUI0348AC2-5版权所有2007ARMLimited。保留所有权利
编译器命令行选项 ARM DUI 0348AC 版权所有 © 2007 ARM Limited。保留所有权利。 2-5 注意 您也可以指定多个限定符。例如,-apcs=/nointerwork/noropi/norwpi 与 -apcs=/nointerwork -apcs=noropi/norwpi 是等效的。 缺省选项 如果未指定 -apcs 选项,编译器将采用 -apcs=/nointerwork/noropi/norwpi。 用法 /[no]interwork 缺省情况下,按下列方式生成代码: • 不支持交互操作(即 /nointerwork),除非指定与体系结 构 ARMv5T 或更高版本相对应的 -cpu 选项 • 支持交互操作(即 /interwork),适用于 ARMv5T 或更 高版本。这是因为 ARMv5T 或更高版本直接支持交互 操作。 /[no]ropi 如果选择使用 /ropi 限定符生成 ROPI 代码,则编译器将执行 下列操作: • 确定只读代码和与 pc 相关的数据的地址 • 在只读输出节上设置与位置无关 (PI) 属性 注意 在编译 C++ 时,不支持 -apcs=/ropi。 /[no]rwpi 如果选择使用 /rwpi 限定符生成 RWPI 代码,则编译器将执 行下列操作: • 使用相对于静态基址寄存器 sb 的偏移量确定可写数据 的地址。这意味着: — 可以在运行时固定 RW 数据区域的基址 — 数据可具有多个实例 — 数据可以是与位置无关的,但这并不是必需的 • 在读写输出节上设置 PI 属性
编译器命令行选项注意由于--1ower_rwpi选项是缺省选项,因此非RWPI代码会自动转换为等效的RWPI代码。这种静态初始化将在运行时由C++构造函数机制完成,即使在C语言中也是如此。/[no]fpic如果选择此选项,则编译器将执行下列操作使用PC相对的寻址访问所有静态数据使用链接器所创建的全局偏移表(GOT)条目访问所有导入或导出的读写数据访问与pc相关的所有只读数据如果代码使用了共享对象,则您必须用/fpic编译代码。这是因为仅当代码使用了SystemV共享库时才实现相对寻址。在构建静态映像或静态库时,无需用/fpic进行编译。在编译C++时支持使用/fpic。在这种情况下,虚拟表函数和typeinfo将放在读写区域中,以便可PC相对的位置对其进行访问。限制使用/ropi、/rwpi或/fpic编译代码时存在一些限制。用/ropi进行编译时,主要存在下列限制/ropi在编译C++时不支持使用--apcs=/ropi。在用--apcs=/ropi进行编译时,一些合法的C结构体不起作.用。例如extern const int ci;// roconst int *p2=&ci;// this static initialization// does not workwith--apcs=/ropi若要使此类静态初始化有效,请使用--1ower_ropi选项编译代码。例如armcc --apcs-/ropi --lower_ropi/rwpi用/rwpi进行编译时,主要存在下列限制在用--apcs=/rwpi进行编译时,一些合法的C结构体不起作用。例如2-6ARMDUI0348AC版权所有2007ARMLimited。保留所有权利
编译器命令行选项 2-6 版权所有 © 2007 ARM Limited。保留所有权利。 ARM DUI 0348AC 注意 由于 -lower_rwpi 选项是缺省选项,因此非 RWPI 代码会自 动转换为等效的 RWPI 代码。这种静态初始化将在运行时由 C++ 构造函数机制完成,即使在 C 语言中也是如此。 /[no]fpic 如果选择此选项,则编译器将执行下列操作: • 使用 PC 相对的寻址访问所有静态数据 • 使用链接器所创建的全局偏移表 (GOT) 条目访问所有 导入或导出的读写数据 • 访问与 pc 相关的所有只读数据 如果代码使用了共享对象,则您必须用 /fpic 编译代码。这 是因为仅当代码使用了 System V 共享库时才实现相对寻址。 在构建静态映像或静态库时,无需用 /fpic 进行编译。 在编译 C++ 时支持使用 /fpic。在这种情况下,虚拟表函数 和 typeinfo 将放在读写区域中,以便可PC 相对的位置对其进 行访问。 限制 使用 /ropi、/rwpi 或 /fpic 编译代码时存在一些限制。 /ropi 用 /ropi 进行编译时,主要存在下列限制: • 在编译 C++ 时不支持使用 -apcs=/ropi。 • 在用 -apcs=/ropi 进行编译时,一些合法的 C 结构体不起作 用。例如: extern const int ci; // ro const int *p2 = &ci; // this static initialization // does not work with -apcs=/ropi 若要使此类静态初始化有效,请使用 -lower_ropi 选项编译代 码。例如: armcc -apcs=/ropi -lower_ropi /rwpi 用 /rwpi 进行编译时,主要存在下列限制: • 在用 -apcs=/rwpi 进行编译时,一些合法的 C 结构体不起作 用。例如:
编译器命令行选项int i;//rwint *pl =&i;// this static initialization//doesnotworkwith--apcs=/rwpi//--no_lower_rwpi若要使此类静态初始化有效,请使用--1ower_rwpi选项编译代码。例如armcc --apcs=/rwpi注意因为--lower_rwpi是缺省选项,所以不必另行指定。/fpic用/fpic进行编译时,主要存在下列限制如果使用--apcs=/fpic,则编译器只导出标有二declspec(d7lexport)的函数和数据。如果在同一命令行中使用--apcs=/fpic和--no_hide_a11,则编译器将忽略_dec1spec(d71+),并导出所有的extern变量和函数。编译器将对导出的函数禁用自动内联。如果在GNU模式下使用--apcs=/fpic,还必须使用-no_hide_all。另请参阅第2-46页的--[no_Jhide_all第2-60页的--[no_]lower_ropi第2-60页的--[no_Jlower_rwpi第4-24页的declspec(dllexport)库指南中第2-3页的编写可重入且线程安全的代码链接器指南中第3-18页的胶合代码生成链接器指南中的第6章BPABI和SystemV共享库和可执行文件instal1_directoryDocumentation\Specifications)...中的《ARM体系结构的过程调用标准》ARMDUI0348AC2-7版权所有2007ARMLimited。保留所有权利
编译器命令行选项 ARM DUI 0348AC 版权所有 © 2007 ARM Limited。保留所有权利。 2-7 int i; // rw int *p1 = &i; // this static initialization // does not work with -apcs=/rwpi // -no_lower_rwpi 若要使此类静态初始化有效,请使用 -lower_rwpi 选项编译代 码。例如: armcc -apcs=/rwpi 注意 因为 -lower_rwpi 是缺省选项,所以不必另行指定。 /fpic 用 /fpic 进行编译时,主要存在下列限制: • 如果使用 -apcs=/fpic,则编译器只导出标有 _declspec(dllexport) 的函数和数据。 • 如果在同一命令行中使用 -apcs=/fpic 和 -no_hide_all,则编 译器将忽略 _declspec(dll*),并导出所有的 extern 变量和函 数。编译器将对导出的函数禁用自动内联。 • 如果在 GNU 模式下使用 -apcs=/fpic,还必须使用 - - no_hide_all。 另请参阅 • 第2-46 页的- -[no_]hide_all • 第2-60 页的- -[no_]lower_ropi • 第2-60 页的- -[no_]lower_rwpi • 第4-24 页的_declspec(dllexport) • 库指南中第2-3 页的编写可重入且线程安全的代码 • 链接器指南中第3-18 页的胶合代码生成 • 链接器指南中的第 6 章 BPABI 和 System V 共享库和可执行文件 • install_directory\Documentation\Specifications\. 中的《ARM 体系结构的 过程调用标准》