Hi Rod,

Rod Evans píše v st 14. 07. 2010 v 10:08 -0700:
> Milan pointed me at some binaries to run.
> 
> First, I looked at just dl*() requests:
> 
> oxpoly1 634. LD_DEBUG=dl LD_DEBUG_OUTPUT=dbg FBReader -zlui gtk
> .....
> 26471: 1:
> 26471: 1: file=0;  dlopen() called from file=/usr/lib/mps/libnspr4.so  [ 
> RTLD_LAZY ]
> 26471: 1:
> 26471: 1: symbol=nspr_use_zone_allocator;  dlsym() called from 
> file=/usr/lib/mps/libnspr4.so; 
> starting at file=/usr/bin/FBReader
> 26471: 1:
> 26471: 1:
> 26471: 1: ld.so.1: FBReader: fatal: nspr_use_zone_allocator: can't find symbol
> 26471: 1:
> 26471: 1:
> 26471: 1: file=0;  dlclose() called from file=/usr/lib/mps/libnspr4.so  
> ignored
> 26471: 1:
> 26471: 1: file=0;  dlopen() called from file=/usr/lib/mps/libnspr4.so  [ 
> RTLD_LAZY ]
> 26471: 1:
> 26471: 1:
> 26471: 1: transferring control: /usr/bin/FBReader
> 26471: 1:
> 26471: 1:
> 26471: 1: file=/usr/lib/zlibrary/ui/zlui-gtk.so;  dlopen() called from 
> file=/usr/lib/libzlcore.so.0.13  [ RTLD_NOW ]
> 26471: 1:
> 26471: 1: symbol=initLibrary;  dlsym() called from 
> file=/usr/lib/libzlcore.so.0.13; starting at 
> file=/usr/lib/zlibrary/ui/zlui-gtk.so
> 26471: 1:
> 26471: 1: dlerror() called from file=/usr/lib/libzlcore.so.0.13: ld.so.1: 
> FBReader: fatal: 
> nspr_use_zone_allocator: can't find symbol
> 
> 
> So, the dlsym() error for nspr_use_zone_allocator occurred a long time back.
> Since this "error" condition, we've loaded a bunch more files, transferred
> control to the application (jumped to main) and seem to be in ZLibrary::init:
> 
> oxpoly1 642. mdb /usr/bin/FBReader
>  > :s
>  > ld.so.1`dlerror+8:b
>  > :r -zlui gtk
> loading /usr/lib/zlibrary/ui/zlui-gtk.so
> mdb: stop at ld.so.1`dlerror+8
> ....
>  > $c
> ld.so.1`dlerror+8(fe511664, ff2afb40, ffbff91c, ff360dd8, fe541258, 1)
> libzlcore.so.0.12.10`_ZN8ZLibrary4initERiRPPc+0x410(800, ffbff808, 800, 
> ff2afb38
> , ffbff838, abc)
> main+0x10(3, ffbff93c, ffbff94c, 2238a4, 0, fea30200)
> _start+0x5c(0, 0, 0, 0, 0, 0)
> 
> 
> chaz 2011. dem  _ZN8ZLibrary4initERiRPPc
> _ZN8ZLibrary4initERiRPPc == ZLibrary::init(int&, char**&)
> 
> 
> It seems that this function is calling dlerror(), which is returning:
> 
>    DESCRIPTION
>       The dlerror() function returns a  null-terminated  character
>       string  that  describes  the last error that occurred during
>       dynamic linking processing.
> 
> Note the *last error* part.
> 
> The question is why is ZLibrary::init calling dlerror()?  I assume that
> ZLibrary::init is discovering a non-NULL return, and then causing the
> process to exit.
> 
> The last thing I see is ZLibrary::init is calling dlopen(zlui-gtk.so),
> a very expensive operation, as it results in loading 42 more libraries
> and relocating them fully, plus relocating a bunch of existing libraries
> that are loaded, because of RTLD_NOW ... so much for lazy loading :-)
> 
> Then ZLibrary::init successfully obtains a symbol:
> 
> 26493: 1: symbol=initLibrary;  dlsym() called from 
> file=/usr/lib/libzlcore.so.0.13; starting at 
> file=/usr/lib/zlibrary/ui/zlui-gtk.so
> 26493: 1: binding file=/usr/lib/libzlcore.so.0.13 to 
> file=/usr/lib/zlibrary/ui/zlui-gtk.so: symbol 
> 'initLibrary'
> 
> Then it calls dlerror():
> 
> 26493: 1: dlerror() called from file=/usr/lib/libzlcore.so.0.13: ld.so.1: 
> FBReader: fatal: 
> nspr_use_zone_allocator: can't find symbol
> 
> I can't find the code for this yet, but my speculation is that there's
> something like:
> 
>       sym = dlsym(handle-for-zlui-gtk.so, "initLibrary")
>       if ((str = dlerror()) != NULL)
>               fail();
> 
> where as things should be:
> 
>       if ((sym = dlsym(handle-for-zlui-gtk.so, "initLibrary")) == NULL) {
>               printf("%s\n", dlerror());
>               fail();
> 
> Seems hard to believe, but I can't think of anything else right now.
> 

Well, fbreader is C++ not very nicely written, so here is the code:


        void (*initLibrary)();
        *(void**)&initLibrary = dlsym(handle, "initLibrary");
        const char *error = dlerror();
        if (error != 0) {
                ZLLogger::Instance().println(ZLLogger::DEFAULT_CLASS,
error);
                return false;
        }

So your evaluation is catching the problem. After evaluation of
possibilities, I forced FBReader to link the library staticaly to
FBReader binary and this code is not running now (and start of
application is faster), FBReader is happy now.

Thank you a lot for this evaluation (and I learnt new things around dl
functions...).

Best regards,

Milan

_______________________________________________
tools-linking mailing list
[email protected]

Reply via email to