C-H*_*che 5 c c++ gcc g++ name-mangling
有人可以帮助我理解 gcc 名称修改约定吗?
考虑以下测试代码
#include <stdio.h>
const int x = 42;
int y = 42;
int main( int argc, const char* argv[] )
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行时,nm我得到以下(令人惊讶的?)结果:
0000000000000000 T main
0000000000000000 D y
0000000000000000 r _ZL1x
Run Code Online (Sandbox Code Playgroud)
这表明编译器只修改放置在只读部分中的全局变量。我希望编译器要么破坏 ALL 要么没有全局变量
这是预期的行为吗?对我来说,它看起来不一致。
Mangling 主要用于区分否则会合理冲突的链接器符号。
由于x是隐式静态的,多个翻译单元可以合法地拥有不同的变量,所有变量都称为x,因此符号被破坏以避免冲突。
既然y是不是静态的,只能有一个叫全局变量y的程序,所以没有必要,以避免冲突(它们要么被标记为ODR违反或消除重复的链接器)。
另一个用途是用于函数,以区分名称相同但参数列表不同的重载。这显然不适用于这里。