Зачем компилятору генерировать повторяющиеся символы в одном и том же объекте?

Возьмите следующий исходный код:

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 разные.

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]