Global destructor order problems (was: Re: Are ports supposed to build and run on 10-CURRENT?)
freebsd at grem.de
Wed Jun 26 21:09:09 UTC 2013
On Thu, 27 Jun 2013 00:05:34 +0300
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
> 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.
The link step doesn't require -fPIC, only main.cpp needs to be built
with it to trigger the problem (which is not that uncommon after all).
All test were done using amd64.
More information about the freebsd-ports