为什么gcc和icc为C ++函数生成具有相同标签名称的asm?

时间:2014-03-22 06:01:01

标签: c++ gcc assembly icc

我使用gcc和icc编译了一个简单的C ++函数。

void modify_array(int* arr, int size) {
    for (int i=0; i<size; i++) {
        arr[i] += 1;
    }
}

我很惊讶地发现gcc和icc会生成具有相同标签名称的程序集。

    .globl __Z12modify_arrayPii
Z12modify_arrayPii:
...

为什么它们一致?这些标签名称背后的含义是什么?

3 个答案:

答案 0 :(得分:1)

我认为icc和gcc遵循相同名称的修改惯例只是巧合,可能就是icc在实现name mangling时借用了gcc的想法。否则,不同的编译器供应商可以自由选择不同的命名约定,因为它没有被c++ standard.标准化

不同的编译器(或许多情况下相同编译器的不同版本)在不同的名称修饰方案下生成这样的二进制文件,这意味着如果编译器用于创建库并且使用它的程序采用不同的方案,则符号经常是未解析的。经典的“带注释的C ++参考手册”积极鼓励使用不同的修改方案,以防止在ABI的其他方面(例如异常处理和虚拟表布局)不兼容时进行链接。

答案 1 :(得分:1)

英特尔C ++编译器(ICC)与GCC二进制兼容。很多情况下,客户混合搭配不同的编译器来构建他们项目的不同部分(使用GCC构建某些源文件,使用ICC构建其他部分。在这些情况下,ICC构建二进制文件只有在它们是二进制文件时才能与GCC构建二进制文件共存在某些情况下,客户使用英特尔C ++编译器构建他的应用程序,但他的应用程序依赖于使用GCC构建的第三方库。因此坚持使用GNU命名约定有助于Linux使ICC与GCC二进制兼容。 / p>

答案 2 :(得分:1)

Intel state他们正在刻意努力让ABI与Linux版本的ICC兼容GCC。虽然GCC maintainers state他们正在努力通过遵循行业C ++ ABI标准来提供稳定的ABI。这有助于保持稳定的环境,这有助于英特尔相当成功的努力。

所以它肯定不是巧合,而是通过设计,他们使用相同的名称作为提供相同ABI的一部分。