Hi,

I hope I've researched this enough to ask decent questions.

I'm running gcc 4.5.2.  AIX 6.1 TL07 SP03.

The essence of the problem is when a shared library is loaded, sometimes atexit 
is called with a pointer to a destructor.  This call (I gather) is produced by 
gcc itself (or g++).

The problem is when the shared library is unloaded (dlclose() is called), the 
TOC is blasted.  Later, when the program terminates, atexit runs and crashes 
because it can't get to the TOC or the destructor.

I tried -fuse-cxa-atexit but __cxa_atexit is not defined on AIX.

The module's ctor (if that is the right term?) calls a routine per file (it 
looks like) which sometimes calls atexit -- I assume to register a dtor.

The dlclose routine does call the module's dtor (e.g. 
_GLOBAL__FD_mod_passenger_so) but it does not end up calling unatexit (which 
may be an AIX'ism) to remove the atexit entry.

I don't know if this is significant but the "passenger" module depends upon 
libstdc++.  Both register an atexit routine however the first one (which 
appears to be for passenger), the TOC entry resides in the normal data space 
(0x3xxxxxxx in this case).  It is actually libstdc++ that registers the atexit 
routine that resides in the 0xfxxxxxxx space which gets zeroed out when it is 
unloaded.

The stack when the 2nd atexit call is made is:

#0  0xd019b644 in atexit () from /usr/lib/libc.a(shr.o)
#1  0xd57c6f3c in _GLOBAL__I_65535_0__ZSt15future_category () at  _start_ :132
#2  0xd58044c8 in _GLOBAL__FI_libstdc___so () from 
/gsa/ausgsa-p9/06/ruby/lib/pthread/libstdc++.a(libstdc++.so.6)
#3  0xd0197828 in mod_init1 () from /usr/lib/libc.a(shr.o)
 ...

The more I research this the more twists and turns it takes so I may have 
stopped too early to ask my questions but I hope not.

The question is: what can I do about this?  It seems like either atexit should 
not be used or a call to unatexit should be rigged up to remove it when the 
module's dtor is called.

Thank you,
Perry

Reply via email to