为什么编译器会在同一个对象中生成重复的符号?

时间:2016-07-07 04:28:23

标签: c++ g++ symbols clang++ nm

采用以下源代码:

struct Foo {
    Foo(){}
};

Foo f;

使用clang++编译时,它会为构造函数创建一个符号:

clang++ -c foo.cpp
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()

但是,当使用g++编译时,它会为构造函数创建多个符号:

g++ -c foo.cpp;
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()
0000000000000000 W Foo::Foo()
0000000000000000 n Foo::Foo()

为什么g++会在同一个目标文件中创建重复的弱符号?
我唯一的理论是它与内联有关,但这只是猜测。

我应该注意,受损的名字显示如下:

g++ -c foo.cpp; nm foo.o | grep Foo 
0000000000000000 W _ZN3FooC1Ev
0000000000000000 W _ZN3FooC2Ev
0000000000000000 n _ZN3FooC5Ev

因此,尽管未拼写的名称相同,但ZN3FooC1EvZN3FooC2Ev却不同。

0 个答案:

没有答案