Compile this with current 4.1 branch (verified with 4.1.2 20060710): % cat one.ii template <typename T> struct One { static const int A; }; template <typename T> const int One<T>::A = 5; int f() { return One<int>::A; } % ./gcc/cc1plus one.ii && gcc -c one.s && nm one.o | c++filt U __gxx_personality_v0 00000000 T f() 00000000 D _ZN3OneIT_E1AE (strangely enough the name _ZN3OneIT_E1AE can't be demangled, but that's secondary). The important point is that this is a template member, which is not defined as weak or linkonce symbol. This breaks when the template is instantiated in multiple .o files (it occurred while compiling obby). Interestingly it depends on the member being marked "const". Without it the symbols look right: 00000000 V One<int>::A With 4.1.0 this generated no .data objects at all (presumably by optimizing away all references to it, by using the constness), and hence no symbol conflicts, so something changed till 4.1.0.
*** This bug has been marked as a duplicate of 28016 ***