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

允许或禁止生成其相对地址引用与程序的加载位置无关的只读且与位置无关的代码。

Note

您也可以指定多个限定符。 例如,--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) 属性

Note

在编译 C++ 时,不支持 --apcs=/ropi

/[no]rwpi

如果选择使用 /rwpi 限定符生成 RWPI 代码,则编译器将执行下列操作:

  • 使用相对于静态基址寄存器 sb 的偏移量确定可写数据的地址。 这意味着:

    • 可以在运行时固定 RW 数据区域的基址

    • 数据可具有多个实例

    • 数据可以是与位置无关的,但这并不是必需的

  • 在读写输出节上设置 PI 属性。

Note

由于 --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;               // rw
    
    int *p1 = &i;        // this static initialization
    
                         // does not work with --apcs=/rwpi
    
                         // --no_lower_rwpi
    
    

    若要使此类静态初始化有效,请使用 --lower_rwpi 选项编译代码。 例如:

    
    armcc --apcs=/rwpi
    
    

    Note

    因为 --lower_rwpi 是缺省选项,所以不必另行指定。

/fpic

/fpic 进行编译时,主要存在下列限制:

  • 如果使用 --apcs=/fpic,则编译器只导出标有 __declspec(dllexport) 的函数和数据。

  • 如果在同一命令行中使用 --apcs=/fpic--no_hide_all,则编译器将忽略 __declspec(dll*),并导出所有的 extern 变量和函数。 编译器将对导出的函数禁用自动内联。

  • 如果在 GNU 模式下使用 --apcs=/fpic,还必须使用 --no_hide_all

另请参阅

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential