This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Memory layout changed for classes with virtual functions


On 23 December 2010 18:55, Andrew Haley wrote:
> On 12/23/2010 03:37 PM, ronny meeus wrote:
>
>> we are changing our compiler from gcc version 2.95.3 to a more recent
>> version (gcc version 3.4.6).
>
> Are you sure about this? ?This is 2010, nearly 2011. ?You are changing
> to a 2004 compiler, last updated in 2006.

I completely agree with Andrew, if you have to update to a newer
compiler you might as well update to a modern version, or you'll just
have to rewrite code again one day.

>> What we have observed is that the memory layout of C++ objects with
>> virtual functions has been changed.
>
> This is all to do with the multi-vendor C++ ABI. ?We had to change gcc
> in order to conform to this.
>
>> Now that we are moving to a newer version, our SW is broken since the
>> virtual table ptr is stored as first entry in the object's memory.
>> As soon as we insert an object in a list, we simply corrupt the VTABLE
>> pointer and the SW soon crashes.
>>
>> Now my questions are:
>> - is there a kind of mode / compiler option to make the new compiler
>> use the old memory layout?
>
> I don't think so.
>
>> - does somebody know a solution (except rewriting the complete code base)
>> ?
>
> It doesn't sound so terribly hard to fix your macros in order to make
> this correct code.
>
> In addition to the layout problem you're having, (void**)&aptr isn't
> even well-defined C++ and may generate incorect code on recent
> compilers. ?So, I think you're going to have to clean this up anyway,
> I'm afraid.

The code was always non-portable, unsafe and incorrect.  Someone
really should have noticed it was a problem at some point in the past
decade.

Why not just assign to list->next?
You could still do that with a macro if you have some (probably
questionable) reason to avoid templates.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]