How does solib handline shared library unloads?

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

How does solib handline shared library unloads?

Christopher Faylor
Can anyone enlighten me as to how information about a library is
relinquished when a library loaded via dlopen is unloaded via dlclose?
Theoretically, the information about the library should be removed and
the library should not be listed by "info sharedlibrary".

I don't see any way for this to be handled in solib.c and inf*.c but I'm
sure I'm just missing something obvious.  I haven't written a test case
yet to see how it is being handled but I was hoping someone could
clarify this for me.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Mark Kettenis
> Date: Tue, 1 Nov 2005 00:39:34 -0500
> From: Christopher Faylor <[hidden email]>
>
> Can anyone enlighten me as to how information about a library is
> relinquished when a library loaded via dlopen is unloaded via dlclose?
> Theoretically, the information about the library should be removed and
> the library should not be listed by "info sharedlibrary".
>
> I don't see any way for this to be handled in solib.c and inf*.c but I'm
> sure I'm just missing something obvious.  I haven't written a test case
> yet to see how it is being handled but I was hoping someone could
> clarify this for me.

It happens as part of solib_add(), which should be called for every
shared library events, not just dlopen()s.  See the code in
update_solib_list() for the code that actually removes libraries from
GDB's internal list.

That said, I think I have convinced myself in the past that there is a
big gaping memory leak.

Mark
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Christopher Faylor
On Tue, Nov 01, 2005 at 07:58:35AM +0100, Mark Kettenis wrote:

>> Date: Tue, 1 Nov 2005 00:39:34 -0500
>> From: Christopher Faylor
>>
>> Can anyone enlighten me as to how information about a library is
>> relinquished when a library loaded via dlopen is unloaded via dlclose?
>> Theoretically, the information about the library should be removed and
>> the library should not be listed by "info sharedlibrary".
>>
>> I don't see any way for this to be handled in solib.c and inf*.c but I'm
>> sure I'm just missing something obvious.  I haven't written a test case
>> yet to see how it is being handled but I was hoping someone could
>> clarify this for me.
>
>It happens as part of solib_add(), which should be called for every
>shared library events, not just dlopen()s.  See the code in
>update_solib_list() for the code that actually removes libraries from
>GDB's internal list.

Is this handled as part of the so breakpoint stuff?  I was trying to
avoid implementing that but I will if I have to.

>That said, I think I have convinced myself in the past that there is a
>big gaping memory leak.

I was wondering about that.  I thought there might be a big memory leak
there since it doesn't look like objfile's are being freed.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Daniel Jacobowitz-2
On Tue, Nov 01, 2005 at 08:45:47AM -0500, Christopher Faylor wrote:

> On Tue, Nov 01, 2005 at 07:58:35AM +0100, Mark Kettenis wrote:
> >> Date: Tue, 1 Nov 2005 00:39:34 -0500
> >> From: Christopher Faylor
> >>
> >> Can anyone enlighten me as to how information about a library is
> >> relinquished when a library loaded via dlopen is unloaded via dlclose?
> >> Theoretically, the information about the library should be removed and
> >> the library should not be listed by "info sharedlibrary".
> >>
> >> I don't see any way for this to be handled in solib.c and inf*.c but I'm
> >> sure I'm just missing something obvious.  I haven't written a test case
> >> yet to see how it is being handled but I was hoping someone could
> >> clarify this for me.
> >
> >It happens as part of solib_add(), which should be called for every
> >shared library events, not just dlopen()s.  See the code in
> >update_solib_list() for the code that actually removes libraries from
> >GDB's internal list.
>
> Is this handled as part of the so breakpoint stuff?  I was trying to
> avoid implementing that but I will if I have to.

Well, that's how we get to solib_add for svr4 targets; but it should
work to get there off an explicit DLL unload event, anyway.  I think.

> >That said, I think I have convinced myself in the past that there is a
> >big gaping memory leak.
>
> I was wondering about that.  I thought there might be a big memory leak
> there since it doesn't look like objfile's are being freed.

I'm not sure... ideally, I'd rather they were neither freed nor leaked,
since we're likely to load them again.  But that may be a lot of work
yet.

--
Daniel Jacobowitz
CodeSourcery, LLC
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Christopher Faylor
On Tue, Nov 01, 2005 at 08:51:42AM -0500, Daniel Jacobowitz wrote:
>On Tue, Nov 01, 2005 at 08:45:47AM -0500, Christopher Faylor wrote:
>>Is this handled as part of the so breakpoint stuff?  I was trying to
>>avoid implementing that but I will if I have to.
>
>Well, that's how we get to solib_add for svr4 targets; but it should
>work to get there off an explicit DLL unload event, anyway.  I think.

Yeah, that's what I did but I think that the more I make the windows
target work like linux, the less chance there will be that it will get
out of sync with ongoing development.

So, I might eventually just try to make this work more like linux.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Daniel Jacobowitz-2
On Tue, Nov 01, 2005 at 09:40:32AM -0500, Christopher Faylor wrote:

> On Tue, Nov 01, 2005 at 08:51:42AM -0500, Daniel Jacobowitz wrote:
> >On Tue, Nov 01, 2005 at 08:45:47AM -0500, Christopher Faylor wrote:
> >>Is this handled as part of the so breakpoint stuff?  I was trying to
> >>avoid implementing that but I will if I have to.
> >
> >Well, that's how we get to solib_add for svr4 targets; but it should
> >work to get there off an explicit DLL unload event, anyway.  I think.
>
> Yeah, that's what I did but I think that the more I make the windows
> target work like linux, the less chance there will be that it will get
> out of sync with ongoing development.
>
> So, I might eventually just try to make this work more like linux.

Well, there's other targets which provide explicit unload notification
(HP/UX; perhaps Symbian someday)...

--
Daniel Jacobowitz
CodeSourcery, LLC
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Christopher Faylor
On Tue, Nov 01, 2005 at 10:12:12AM -0500, Daniel Jacobowitz wrote:

>On Tue, Nov 01, 2005 at 09:40:32AM -0500, Christopher Faylor wrote:
>> On Tue, Nov 01, 2005 at 08:51:42AM -0500, Daniel Jacobowitz wrote:
>> >On Tue, Nov 01, 2005 at 08:45:47AM -0500, Christopher Faylor wrote:
>> >>Is this handled as part of the so breakpoint stuff?  I was trying to
>> >>avoid implementing that but I will if I have to.
>> >
>> >Well, that's how we get to solib_add for svr4 targets; but it should
>> >work to get there off an explicit DLL unload event, anyway.  I think.
>>
>> Yeah, that's what I did but I think that the more I make the windows
>> target work like linux, the less chance there will be that it will get
>> out of sync with ongoing development.
>>
>> So, I might eventually just try to make this work more like linux.
>
>Well, there's other targets which provide explicit unload notification
>(HP/UX; perhaps Symbian someday)...

Cygwin sets TARGET_WAITKIND_LOADED when a DLL is loaded but I don't see
any corresponding TARGET_WAITKIND_UNLOADED.  It doesn't look like
TARGET_WAITKIND_LOADED calls solib_add, though.

cgf
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Daniel Jacobowitz-2
On Tue, Nov 01, 2005 at 11:20:25AM -0500, Christopher Faylor wrote:
> Cygwin sets TARGET_WAITKIND_LOADED when a DLL is loaded but I don't see
> any corresponding TARGET_WAITKIND_UNLOADED.  It doesn't look like
> TARGET_WAITKIND_LOADED calls solib_add, though.

Yes: those are (were) just used for catch, not for actual shared
library list management.  This is bogus; that's the part that ought to
be fixed in core GDB.

--
Daniel Jacobowitz
CodeSourcery, LLC
Reply | Threaded
Open this post in threaded view
|

Re: How does solib handline shared library unloads?

Mark Kettenis
> Date: Tue, 1 Nov 2005 11:24:37 -0500
> From: Daniel Jacobowitz <[hidden email]>
>
> On Tue, Nov 01, 2005 at 11:20:25AM -0500, Christopher Faylor wrote:
> > Cygwin sets TARGET_WAITKIND_LOADED when a DLL is loaded but I don't see
> > any corresponding TARGET_WAITKIND_UNLOADED.  It doesn't look like
> > TARGET_WAITKIND_LOADED calls solib_add, though.
>
> Yes: those are (were) just used for catch, not for actual shared
> library list management.  This is bogus; that's the part that ought to
> be fixed in core GDB.

Indeed, there's quite a bit old cruft in the shared library code.
HP-UX doesn't use TARGET_WAITKIND_LOADED anymore, but it seems it is
still used for AIX.  That said, it defenitely is preferable to have
those events instead of overloading the breakpoint mechanism like
Linux does.  Using shared library breakpoints means that core GDB
needs to figure out whether we stopped because of a shared library
event or a normal breakpoint.  Chris, if your OS can tell you why it
stopped, you shouldn't throw away that information.

Mark