Gcc emit wrong symbols in multiple inheritance case

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dear Gcc developers,

   When I am trying to build Mozilla with gcc-mingw, I came across
the linkage error of undefined symbols in multiple inheritance case.
And I have made a simple test case to reproduce the problem. But the
test case is still very complex, I think. So, I came down to find the
what are the real problems. And now, I think I have, so I just
describe what I found here:

For a class hierarchy :

class SuperSuperBase {
public:
       SuperSuperBase();
       ~SuperSuperBase();

       virtual void __attribute__((__stdcall__)) funcSSB() = 0;
};

class SuperBase : public SuperSuperBase {
public:
       SuperBase();
       ~SuperBase();

       virtual void __attribute__((__stdcall__)) funcSB() = 0;
};

class Base : public SuperBase {
public:
       Base();
       ~Base();

       virtual void __attribute__((__stdcall__)) funcB() = 0;
};

class ChildA: public Base {
public:
       ChildA();
       ~ChildA();

       virtual void __attribute__((__stdcall__)) funcCA() = 0;
};

class ChildB: public SuperBase {
public:
       ChildB();
       ~ChildB();

       virtual void __attribute__((__stdcall__)) funcCB() = 0;
};

class DLL Child :       public  ChildA,
                public  ChildB {
public:
       Child();
       ~Child();

       virtual void __attribute__((__stdcall__)) funcSSB();
       virtual void __attribute__((__stdcall__)) funcSB();
       virtual void __attribute__((__stdcall__)) funcB();
       virtual void __attribute__((__stdcall__)) funcCB();
       virtual void __attribute__((__stdcall__)) funcCA();
};

I make the Child in a DLL and then I import it from the DLL to build a
test application. But I failed with the undefined symbols of
"funcSSB,funcSB,funcCB".
And the errors occurs when I build with gcc 4.3.0 but not with gcc
3.4.2. So, I use i686-mingw32-nm to dump the object file which
contains the definition of the Child class. And for the three
undefined functions, the two compiler output different symbols,
Gcc 3.4.2:
        U __ZTVN10__cxxabiv117__class_type_infoE
        U __ZTVN10__cxxabiv120__si_class_type_infoE
        U __ZTVN10__cxxabiv121__vmi_class_type_infoE
00000000 T __ZThn4_N5Child6funcCBEv@4
00000000 T __ZThn4_N5Child6funcSBEv@4
00000000 T __ZThn4_N5Child7funcSSBEv@4

Gcc 4.3.0:
        U __ZTVN10__cxxabiv117__class_type_infoE
        U __ZTVN10__cxxabiv120__si_class_type_infoE
        U __ZTVN10__cxxabiv121__vmi_class_type_infoE
00000306 T __ZThn4_N5Child6funcCBEv
        U __ZThn4_N5Child6funcCBEv@4
000002d7 T __ZThn4_N5Child6funcSBEv
        U __ZThn4_N5Child6funcSBEv@4
000002c8 T __ZThn4_N5Child7funcSSBEv
        U __ZThn4_N5Child7funcSSBEv@4

I think the difference here is the key point of the linkage error.
Could anybody help to give some more insight here? Any advice will be
appreciated very much!

Regards!
Bo

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux