dlclose not calling destructors of static variables.

Andrew West andrewwest@gmail.com
Fri Jan 29 20:32:00 GMT 2010


On 29/01/10 18:45, Christopher Faylor wrote:
> On Fri, Jan 29, 2010 at 02:30:48PM +0000, Andrew West wrote:
>    
>> On 29/01/2010 13:08, Dave Korn wrote:
>>      
>>> On 28/01/2010 11:21, Andrew West wrote:
>>>        
>>>> I seem to be having a problem with dlclose not calling the destructors
>>>> of statically declared variables.  I've attached a simple test case
>>>> which I compile as follows;
>>>>
>>>>          
>>> Thanks for the report and the STC; this should work.  I'll take a look
>>> at it over the weekend or the start of next week if nobody else gets
>>> there first.
>>>
>>>        
>> Thanks for looking into this, it looks a little more complex than I
>> first thought.
>>
>> I've tried calling __call_exitprocs during dlclose ( after run_dtors
>> for the unloading library ) just to see if I was thinking along the
>> right lines.  Unfortunately this didn't work as when the destructor is
>> registered with atexit it isn't associated with the loaded library but
>> with the main executable.
>>
>> Which brings me on to the bigger problem, the static variables are
>> registered with atexit rather than with __cxa_atexit which seems to be
>> a violation of the C++ standard (1).
>>
>> Worse still gcc isn't compiled with cxa_atexit enabled.  So I assume
>> the right course of action here is to enable __cxa_atexit in gcc, and
>> then make sure __cxa_finalize gets called when the library is unloaded?
>>      
> I agree with your assessment here.  I've checked in a change which works
> around the problem you've uncovered but it is not foolproof.  It should
> fix the immediate problem but, in the long run, I agree that gcc should
> be emitting code which calls __cxa_atexit.  Of course I have no idea
> what the other ramifications of doing that might be.  Hopefully Dave can
> enlighten us.
>
> This is in today's snapshot at http://cygwin.com/snapshots/ .
>
>    
O.k. I'll check out the changes on Monday, but one minor point.
Shouldn't the atexit stuff be run after all the destructors have run?


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list