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]