2.6.2. 与位置无关的限定符

这些 --apcs 限定符控制位置无关性。 它们还会影响可重入且线程安全的代码的创建。

有关详细信息,请参阅:

位置无关代码和数据的限制

使用 /ropi/rwpi/fpic 编译代码时存在一些限制。 主要的限制如下:

  • 编译 C++ 时,不支持使用 --apcs /ropi。 只能使用 /ropi 编译 C++ 的 C 子集。

  • 一些合法的 C 结构在使用 --apcs=/ropi--apcs=/rwpi 编译时不起作用,例如:

    
    int i;               // rw
    
    int *p1 = &i;        // this static initialization does not work
    
                         // with --apcs=/rwpi --no_lower_rwpi
    
    
    
    extern const int ci; // ro
    
    const int *p2 = &ci; // this static initialization does not work
    
                         // with --apcs=/ropi
    
    

    但是,要使这些静态初始化有效,请使用 --lower_rwpi--lower_ropi 选项。

    要编译此代码,请键入:

    armcc --apcs=/rwpi/ropi --lower_ropi
    
    

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

  • 编译 C++ 时,不支持使用 --apcs=/fpic。 此时,虚拟表函数和 typeinfo 放在读写区域中,以便可PC 相对的位置对其进行访问。

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

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

    例如,在构建 System V 或 ARM Linux 共享库时结合使用 --no_hide_all--apcs /fpic

有关 __declspec 关键字的详细信息,请参阅《编译器参考指南》第 4-24 页的__declspec 属性

Copyright © 2002-2007 ARM Limited. All rights reserved. ARM DUI 0205HC
Non-Confidential