总结——g++与nasm交叉编译互相引用的接口

  1. g++函数名修饰规则
    1)全局函数:_Z+函数名长度+函数名+函数参数表
    gcc编译后对应的符号表中,几乎没有对标识符做任何修饰,g++对全局变量的处理同样不加修饰,但函数使用_Z开头(C99标准)。函数名之后的一连串字母是形参列表,如i代表 int i n t ,b代表 bool b o o l 。例如C++模块定义了foo(int, char)函数,修饰后的标签为_Z3fooic。通过不同的形参列表后缀,C++实现了重载机制,但是函数的返回值并没有作为标签名的一部分出现,这也就解释了为什么返回值不能作为重载的标志。以下为一些常用类型的后缀:

    类型 修饰
    void v
    bool b
    int i
    char c
    short s
    unsigned j
    long l
    float f
    double d
    类名长度+类名
    常量 K
    引用 R
    指针 P

    2)命名空间/类函数

    函数种类 格式
    构造函数 _Z+N+类名长度+类名+C2+E+参数表(C-constructor、NE-namspace)
    拷贝构造函数 _Z+N+类名长度+类名+C2+E+R[可选K]S(RKS_是对该类对象的常引用,R-reference,K-const)
    析构函数 _Z+N+类名长度+类名+D2+E+v(D-destructor)
    运算符函数 _Z+N+类名长度+类名+运算符英文简写+E+参数表
    普通成员函数、类静态函数、命名空间中的函数 _Z+N+命名空间/类名长度+命名空间/类名+函数名长度+函数名+E+参数表
  2. g++变量修饰规则

    变量种类 格式
    类静态变量、命名空间全局变量 _Z+N+命名空间/类名长度+命名空间/类名+变量名长度+变量名+E
    类成员变量 成员变量不是以符号的形式出现,而是通过类对象的符号和偏移量的方法存取

你可能感兴趣的:(交叉编译)