X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Mon, 1 Feb 2010 11:26:04 -0500 From: Christopher Faylor To: cygwin AT cygwin DOT com Subject: Re: dlclose not calling destructors of static variables. Message-ID: <20100201162603.GB25374@ednor.casa.cgf.cx> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <4B61732F DOT 4030804 AT gmail DOT com> <4B62DDE6 DOT 5070106 AT gmail DOT com> <4B62F118 DOT 8010305 AT gmail DOT com> <20100129184514 DOT GA9550 AT ednor DOT casa DOT cgf DOT cx> <4B66BF2F DOT 4060802 AT gmail DOT com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B66BF2F.4060802@gmail.com> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Mon, Feb 01, 2010 at 11:46:55AM +0000, Andrew West wrote: >On 29/01/2010 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/ . >> >> cgf >> >> > >Hi, > >I checked out the changes and it still crashed for me. Digging into it >the destructor for testlib fell outside of dll_end ( m.AllocationBase + >m.RegionSize ). On a whim I change m.AllocationBase to m.BaseAddress and >that seemed to fix it for me! The destructor ran on dlclose and the >testrunner.exe didn't segfault. Could you clarify? Are you saying that your test case still failed? cgf -- 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