On Wed, Nov 4, 2020 at 11:33 AM zero <[email protected]> wrote: > Hi all, > > The issue is on github link > <https://github.com/cloudius-systems/osv/issues/47> > > Then we continue the discuss. > > But I don't understand the "implicit" dependence you mention... It seems >> you mean that for some reason your application wants to know when or >> whether B is loaded > > > Actually, I'm talking about the reference count of A, and B depends on A. > When load B, it will recursive dlopen A. > So, there is a question, when load B how could *OSv *add A's reference > count too? > > If we don't know the count, when unload A and load A again, because A is > still in memory, dlopen A will return a handle. the static variables in A > will not be reinitialized. >
I think maybe I finally understand what you mean. The dlclose() documentation suggests that it and dlopen() do their own reference counting - and if you dlclose() a library that has been dlopen()ed just once - the library will be unloaded. *Even if *some other library also used it as DT_NEEDED and even if one of the functions in the to-be-unloaded library is being used (because some other library resolved it). But is this really what should happen, or happens, in Linux? If you dlopen() A and *also* dlopen() B which needs A, I think the reference count of A increases twice. How could things work otherwise? > If we use static variables's default constructors dynamic create some > thing in dlopen(we know that dlopen will do init first and then transfer > control to main), if A is in already in memory the init will not work! > > The following is the whole process: > 1. load A > 2. load B(B depends on A ) > 3. unload A > 4. load A -----> *static variables* in A will not be reinitialized > Did you try this on Linux? Does it behave differently from what it does in OSv? If step 3 were to *really* unload A, how would B's code, which is still loaded and may be using symbols from A, continue to work? If between points 3 and 4 you run some function from B, what is supposed to happen? > > > If we have reference count of A is still 1(because we implement reference > count ourselves, I think when we unload A the reference count is 0, but > dlopen in system will be 1), then we know A is still in memory, and do some > work do deal with it. > > Of course, we can also judge whether A is already in memory use dlopen > with *RTLD_NOLOAD* , if A is in memory we will deal with it. > > > > -- > You received this message because you are subscribed to the Google Groups > "OSv Development" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/osv-dev/CADNiy7oBE1Ldc9hcd0dZf35H885Q8icjNAeiXXbZaPK14C16Rg%40mail.gmail.com > <https://groups.google.com/d/msgid/osv-dev/CADNiy7oBE1Ldc9hcd0dZf35H885Q8icjNAeiXXbZaPK14C16Rg%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/CANEVyjspimy%3DA4WBMhkY7285qg6y%3Dyn6p%3D8vcRgxF%3DSfTVz-Zw%40mail.gmail.com.
