On Aug 4, 2012, at 11:56 PM, Ian Lance Taylor wrote: > On Sat, Aug 4, 2012 at 2:43 PM, Perry Smith <pedz...@gmail.com> wrote: >> >> 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. > > On AIX, does the _GLOBAL__FD routine get called reliably on both > dlclose and program exit? If so, it seems that there is no need to > call atexit. If the routine is called reliably on dlclose but not > program end, then I agree that it should call unatexit. As far as I > know that function is specific to AIX, so it sounds like some > AIX-specific code will need to be written. > > As you know, this is not an issue on GNU/Linux, where the compiler can > simply use __cxa_atexit.
I was planning on exploring when _GLOBAL__FD was called today. I need to figure out when gcc puts the call to the dtor in _GLOBAL__FD path rather than in the atexit path. The net implies that "static" uses atexit while a global non-static uses _GLOBAL__FD I'm also exploring what it would take to port a version of GNU's __cxa_atexit to AIX. I think after I figure out when various dtors get called, I should be able to figure out if / how to do that. Part of my confusion / concern is "why have two methods?" Does the spec say that dtors much be called at different times? Thank you for your time, Perry