problem with devel/glib20+COLLATION_FIX=yes+devel/icu+THREADS=yes
Andriy Gapon
avg at icyb.net.ua
Thu Jan 25 15:01:30 UTC 2007
The problem with combination of port devel/glib20 config-ed with
COLLATION_FIX=yes and port devel/icu config-ed with THREADS=yes is that
glib2 pkg-config files are not updated with new dependencies coming from
icu. When icu is built with threads support then icu shared libraries
become dependent on system thread library (libthr/libpthread) and thus
glib20 libraries also become dependent on system thread library (when
COLLATION_FIX=yes). But this dependency is not reflected in pkg-config
--libs.
This leads to potential problems with programs that are linked with
shared glib2 libraries and not explicitly linked with -pthread where
libc is loaded by run-time linker before libpthread and then program
fails with a message like the following:
Fatal error 'Recurse on a private mutex.' at line 986 in file
/usr/src/lib/libpthread/thread/thr_mutex.c (errno = 0)
I do observe this problem in practice. The only remedy is to force
loading of libpthread before libc via LD_PRELOAD.
Some data points just in case:
$ ldd /usr/local/bin/xscreensaver-hacks/bouncingcow
/usr/local/bin/xscreensaver-hacks/bouncingcow:
libXpm.so.4 =>
/usr/X11R6/lib/libXpm.so.4 (0x48084000)
libgdk_pixbuf_xlib-2.0.so.0 =>
/usr/local/lib/libgdk_pixbuf_xlib-2.0.so.0 (0x48094000)
libgdk_pixbuf-2.0.so.0 => /usr/local/lib/libgdk_pixbuf-2.0.so.0
(0x480a3000)
libm.so.4 => /lib/libm.so.4 (0x480b9000)
libgobject-2.0.so.0 =>
/usr/local/lib/libgobject-2.0.so.0 (0x480d0000)
libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x48109000)
libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0
(0x4810d000)
libiconv.so.3 =>
/usr/local/lib/libiconv.so.3 (0x481a2000)
libGL.so.1 => /usr/X11R6/lib/libGL.so.1 (0x48290000)
libGLU.so.1 => /usr/X11R6/lib/libGLU.so.1 (0x4832f000)
libXxf86vm.so.1 =>
/usr/X11R6/lib/libXxf86vm.so.1 (0x483a6000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x483ab000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x483b3000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6
(0x483ca000)
libX11.so.6 =>
/usr/X11R6/lib/libX11.so.6 (0x4841c000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x484f0000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x48505000)
libc.so.6 => /lib/libc.so.6 (0x48513000)
libintl.so.6 =>
/usr/local/lib/libintl.so.6 (0x485fc000)
libicui18n.so.36 => /usr/local/lib/libicui18n.so.36 (0x48605000)
libGLcore.so.1 => /usr/X11R6/lib/libGLcore.so.1
(0x4873d000)
libnvidia-tls.so.1 =>
/usr/X11R6/lib/libnvidia-tls.so.1 (0x49060000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x49062000)
libicuuc.so.36 => /usr/local/lib/libicuuc.so.36
(0x49138000)
libicudata.so.36 =>
/usr/local/lib/libicudata.so.36 (0x4924f000)
libpthread.so.2 => /usr/lib/libpthread.so.2 (0x49bff000)
$ ldd /usr/local/lib/libicuuc.so.36
/usr/local/lib/libicuuc.so.36:
libicudata.so.36 =>
/usr/local/lib/libicudata.so.36 (0x48285000)
libpthread.so.2 => /usr/lib/libpthread.so.2 (0x48c35000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x48c5c000)
libm.so.4 => /lib/libm.so.4 (0x48d32000)
I can verify with ktrace that libc is loaded (mmap-ed) before
libpthread. The program aborts with the quoted above message 'Recurse on
a private mutex.'
If I run the program with env LD_PRELOAD=libpthread.so.2 then everything
is OK.
Also:
$ pkg-config --libs glib-2.0
-L/usr/local/lib -lglib-2.0 -liconv
$ pkg-config --libs gdk-pixbuf-2.0
-L/usr/local/lib -lgdk_pixbuf-2.0 -lm -lgobject-2.0 -lgmodule-2.0
-lglib-2.0 -liconv
--
Andriy Gapon
More information about the freebsd-gnome
mailing list