5

有人可以帮我理解 gcc 名称修改约定吗?

考虑以下测试代码

#include <stdio.h>

const int x = 42;
int y = 42;

int main( int argc, const char* argv[] )
{
        return 0;
}

运行时,nm我得到以下(令人惊讶的?)结果:

0000000000000000 T main
0000000000000000 D y
0000000000000000 r _ZL1x

这表明编译器只会破坏放置在只读部分中的全局变量。我希望编译器能够破坏所有或没有全局变量

这是预期的行为吗?对我来说,它看起来不一致。

4

1 回答 1

5

Mangling 主要用于区分否则会合理冲突的链接器符号。

由于x是隐式静态的,因此多个翻译单元可以合法地拥有不同x的变量 all called ,因此符号被破坏以避免冲突。

由于y不是静态的,因此程序中只能调用一个全局变量y,因此无需避免冲突(它们应该被标记为 ODR 违规或被链接器删除)。

另一种用途是用于函数,以区分名称相同但参数列表不同的重载。这显然不适用于这里。

于 2013-06-12T11:56:34.690 回答