/// template.cc ///////////////////////////////////////// struct VirtualBase { virtual ~VirtualBase(); };
struct Foo {}; struct Bar { virtual ~Bar(); }; template<class OtherBase> class Test : public VirtualBase, public OtherBase { }; void func() { Test<Foo> foo; Test<Bar> bar; } ////////////////////////////////////////// $ /tools/pkg/gcc/3.4.3/bin/g++ -shared -Wl,-G -o lib343.so template.cc $ dump -Tv lib343.so | c++filt IMEX Sclass Type IMPid Name EXP DS Ldef [noIMid] Test<Bar>::~Test() EXP DS Ldef [noIMid] Test<Bar>::~Test() wEXP DS SECdef [noIMid] non-virtual thunk to Test<Bar>::~Test() wEXP DS SECdef [noIMid] non-virtual thunk to Test<Bar>::~Test() wEXP DS SECdef [noIMid] Test<Foo>::~Test() wEXP DS SECdef [noIMid] Test<Foo>::~Test() $ /tools/pkg/gcc/3.3.3/bin/g++ -shared -Wl,-G -o lib333.so template.cc $ dump -Tv lib333.so | c++filt IMEX Sclass Type IMPid Name wEXP DS SECdef [noIMid] Test<Bar>::~Test() wEXP DS SECdef [noIMid] Test<Bar>::~Test() wEXP DS SECdef [noIMid] non-virtual thunk to Test<Bar>::~Test() wEXP DS SECdef [noIMid] non-virtual thunk to Test<Bar>::~Test() wEXP DS SECdef [noIMid] Test<Foo>::~Test() wEXP DS SECdef [noIMid] Test<Foo>::~Test() Note that I edited the dump output to reduce its size. Here you can see, that the Test<...>::~Test() destructor gets a different IMEX. Depending on its template parameter and/or compiler version. I dont know exactly what the difference between EXP and wEXP is, but I suspect that this has something to do with weak symbols. But on the other hand, I always read that AIX supports no weak symbols. Nevertheless, when using the class Test<Bar> in different shared libraries which get linked together, you get warnings about duplicate symbols. This warnings were not present with GCC 3.3.3. I am very nervous when seeing duplicate symbols. Especially on AIX. I had great times in the past analysing problems with uncaught exceptions that were caused by duplicate symbols. -- Summary: duplicate symbol warnings for complex template class Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: joerg dot richter at pdv-fs dot de CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: powerpc-ibm-aix5.2.0.0 GCC host triplet: powerpc-ibm-aix5.2.0.0 GCC target triplet: powerpc-ibm-aix5.2.0.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21264