Just a reminder, you can only post to the list with the mail address you
subscribed with (because of the spam problem we were having).  After my
exams, I may look into setting up a [EMAIL PROTECTED] similar
to what redhat has to allow people to register extra email addresses
without letting spammers post (as they ocasionally try to).

As for the themes/imlib bug, I had worked out what caused it about a week
ago.  In case you were wondering, this bug only occurs with python >=
1.5.2.  I have posted a message on gnome-hackers about the problem, and if
I get no complaints, I will fix it for the imlib and gtk-engines packages.
Maybe getting the gtk.themes.org guy to tell other theme authors about
this potential problem would be a good idea.

James.

--
Email: [EMAIL PROTECTED]
WWW:   http://www.daa.com.au/~james/


On Wed, 26 May 1999 [EMAIL PROTECTED] wrote:

> Hi *, 
> 
> I am sorry I did not write to this list earlier. I did some investigation on
> the themes-related bug in PyGTK and came to the conclusion that it is not
> a bug in pygtk. In fact the theme engines are at fault.
> 
> You need some background information to understand the problem. If you are
> familar with the scopes of symbols in the dynamic linker you can skip this
> section.
> 
> Okay - here is how loading an object works:
> 
> 1. the object requested is mapped into the address space of the program.
>    (if this wasn't done already)
> 2. the objects required by this object are mapped
> 3. the symbols are resolved
> 
> We hit the wall at step three - the dynamic linker can not resolve the symbols
> of the theme engine (in my case it is libpixmap.so). This is from the debugging
> output of the dynamic linker (enabled with export LD_DEBUG=symbols; export
> LD_DEBUG_OUTPUT=/tmp/foo):
> 
> 01507:  symbol=gdk_display;  lookup in file=python
> 01507:  symbol=gdk_display;  lookup in file=/usr/lib/libpython1.5.so.0.0
> 01507:  symbol=gdk_display;  lookup in file=/lib/libdl.so.2
> 01507:  symbol=gdk_display;  lookup in file=/lib/libpthread.so.0
> 01507:  symbol=gdk_display;  lookup in file=/lib/libm.so.6
> 01507:  symbol=gdk_display;  lookup in file=/lib/libc.so.6
> 01507:  symbol=gdk_display;  lookup in file=/lib/ld-linux.so.2
> 01507:  symbol=gdk_display;  lookup in
> file=/usr/lib/gtk/themes/engines/libpixmap.so
> 01507:  symbol=gdk_display;  lookup in file=/usr/lib/libgdk_imlib.so.1
> 01507:  symbol=gdk_display;  lookup in file=/usr/lib/libgmodule-1.2.so.0
> 01507:  symbol=gdk_display;  lookup in file=/lib/libdl.so.2
> 01507:  symbol=gdk_display;  lookup in file=/usr/X11R6/lib/libXi.so.6
> 01507:  symbol=gdk_display;  lookup in file=/usr/X11R6/lib/libXext.so.6
> 01507:  symbol=gdk_display;  lookup in file=/usr/X11R6/lib/libX11.so.6
> 01507:  symbol=gdk_display;  lookup in file=/lib/libm.so.6
> 01507:  symbol=gdk_display;  lookup in file=/lib/libc.so.6
> 01507:  symbol=gdk_display;  lookup in file=/usr/lib/libglib-1.2.so.0
> 01507:  symbol=gdk_display;  lookup in file=/lib/ld-linux.so.2
> 
> As you can see he does not try to load the symbols from libgtk.so. Why?
> 
> So where does ld.so seek for symbols? 
> 1. it searches the global scope
> 2. it searches the object itself
> 3. it searches the dependencies of the object the symbol is needed in.
> 
> What is in the global scope? dl-deps.c from the libc6 source says:
> 
>   /* Now that all this succeeded put the objects in the global scope if
>      this is necessary.  We put the original object and all the dependencies
>      in the global scope.  If an object is already loaded and not in the
>      global scope we promote it.  */
> 
> This is a bit ambiguous. In fact the original object (python) and its
> dependencies are put into the global scope. So let's construct the searchlist
> for libpixmap.so:
> 
> 1. the global scope
>     
>     python - the object itself
> 
>     torsten@pulsar:~ $ ldd /usr/bin/python - the dependencies
>         libpython1.5.so.0.0 => /usr/lib/libpython1.5.so.0.0 (0x40005000)
>         libdl.so.2 => /lib/libdl.so.2 (0x4006f000)
>         libpthread.so.0 => /lib/libpthread.so.0 (0x40073000)
>         libm.so.6 => /lib/libm.so.6 (0x40084000)
>         libc.so.6 => /lib/libc.so.6 (0x400a1000)
>         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
> 
> 2. the object itself
> 
>     libpixmap.so
> 
> 3. its dependencies
> 
>     torsten@pulsar:~ $ ldd /usr/lib/gtk/themes/engines/libpixmap.so
>         libgdk_imlib.so.1 => /usr/lib/libgdk_imlib.so.1 (0x4000e000)
>         libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0x4003c000)
>         libdl.so.2 => /lib/libdl.so.2 (0x40040000)
>         libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x40043000)
>         libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x4004b000)
>         libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40057000)
>         libm.so.6 => /lib/libm.so.6 (0x400fd000)
>         libc.so.6 => /lib/libc.so.6 (0x40293000)
>         libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0x40271000)
>         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
> 
> Now compare these lists - the debug output and this list correspond exactly. 
> 
> 
> 
> Okay, so what can we do about this? Remember this:
> 
>         Where does ld.so seek for symbols? 
>         1. it searches the global scope
>         2. it searches the object itself
>         3. it searches the dependencies of the object the symbol is needed in.
> 
> So we could put the libgtk and libgdk in (1), (2) or (3). Of course (2) will
> not work - we do not want to statically link libpixmap against libg[dt]k. 
> 
> What can we do about (1) - no problem. We can manually put libgdk and libgtk
> in there. We only need to do dlopen("libgtk.so", RTLD_LAZY|RTLD_GLOBAL). The
> problem is that we have to sync this with the lib linked against _gtkmodule.so
> - at least it has to have the same soname as the dynamic linker will catch
> this. Of course we need libgdk.so also.
> 
> Fine. But the simplest way to get out of this is: simply use the dependency
> information of libpixmap.so to put libgtk.so and libgdk.so in (3). This only
> requires a simple patch to the Makefile of the theme engines:
> 
> torsten@pulsar:~/test/gtk-engines-thinice-1.0.1 $ diff -u Makefile.am
> Makefile.am.new
> --- Makefile.am Tue May 25 20:12:46 1999
> +++ Makefile.am.new     Tue May 25 20:12:40 1999
> @@ -9,4 +9,5 @@
>         thinice_theme_main.c    \
>         thinice_theme.h
>  libthinice_la_LDFLAGS = -export-dynamic
> +libthinice_la_LIBADD = $(GTK_LIBS)
>  EXTRA_DIST = autogen.sh
> 
> After this patch the thinice engine works with no problem on my system. Even
> perl-gtk starts working. Before it had the same problem.
> 
> Conclusion: Let's talk to the engines authors and tell them how to fix their
> packages.
> 
> Thanks
>     Torsten
> 
> PS: This is Cc'ed to a Debian bugreport. Please keep the Cc when answering to
> this mail.
> 

To unsubscribe: echo "unsubscribe" | mail [EMAIL PROTECTED]

Reply via email to