Global destructor order problems (was: Re: Are ports supposed to build and run on 10-CURRENT?)

Michael Gmelin freebsd at grem.de
Wed Jun 26 21:17:42 UTC 2013


On Wed, 26 Jun 2013 23:11:34 +0200
Dimitry Andric <dim at FreeBSD.org> wrote:

> On Jun 26, 2013, at 23:05, Konstantin Belousov <kostikbel at gmail.com>
> wrote:
> > On Wed, Jun 26, 2013 at 10:59:24PM +0200, Dimitry Andric wrote:
> >> On Jun 26, 2013, at 22:45, Konstantin Belousov
> >> <kostikbel at gmail.com> wrote:
> >>> On Wed, Jun 26, 2013 at 09:26:09PM +0200, Dimitry Andric wrote:
> >>>> This revision is not in 9.1-RELEASE, but it is in 9-STABLE, so
> >>>> the problem can also be reproduced there.
> >>> ...
> >>>> This is roughly gcc 4.3.0 and later.  For example, gcc 4.8
> >>>> generates:
> >>> I just tested the thing with gcc 4.8 on up to date stable/9 and
> >>> HEAD. In both cases, major tom did not fail, at least not in the
> >>> peculiar way. The gcc-generated code passed the PLT address of
> >>> the corresponding destructor.
> >> 
> >> That is strange, did you compile the main program with -fPIC?
> >> That is the problem case.  If you don't compile the main program
> >> with -fPIC, the problem will indeed not occur.
> > 
> > I just used the Makefile provided by the earlier message, and it
> > contains the -fPIC flag (which is strange thing to do on its own,
> > binaries should use -fPIE).
> > 
> > This is how the registration for the outer dtr looks for me, gcc
> > 4.8.1/i386:
> > 
> >   0x08048763 <+42>:    call   0x8048520 <_ZN5OuterC1Ev at plt>
> >   0x08048768 <+47>:    lea    0x28(%ebx),%eax
> >   0x0804876e <+53>:    mov    %eax,0x8(%esp)
> >   0x08048772 <+57>:    lea    0x34(%ebx),%eax
> >   0x08048778 <+63>:    mov    %eax,0x4(%esp)
> >   0x0804877c <+67>:    mov    -0x4(%ebx),%eax
> >   0x08048782 <+73>:    mov    %eax,(%esp)
> >   0x08048785 <+76>:    call   0x8048500 <__cxa_atexit at plt>
> > 
> > ebx was set up earlier as the GOT pointer.
> 
> Strange, you must have a different gcc 4.8 than me, in my case it
> always uses GOT:
> 
>         call    _ZN5OuterC1Ev at PLT
>         leal    __dso_handle at GOTOFF(%ebx), %esi
>         addl    $12, %esp
>         pushl   %esi
>         pushl   %edi
>         pushl   _ZN5OuterD1Ev at GOT(%ebx)
>         call    __cxa_atexit at PLT
> 
> This is the lang/gcc48 port, btw.
> 
> -Dimitry
> 

Are you both on the same architecture?



-- 
Michael Gmelin


More information about the freebsd-ports mailing list