Возьмите следующий исходный код:
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
Так что, хотя не распутанные имена одинаковы, ZN3FooC1Ev
а также ZN3FooC2Ev
разные.
Задача ещё не решена.
Других решений пока нет …