GLib undefined symbol bug in Debian

Xilin Sun
2 min readDec 4, 2018

--

BUG

After a regular software upgrade, my Debian sid refused to start lightdm service. Viewing the log by running journalctl -xe, I saw something like this:

Dec 03 14:32:38 acers3 lightdm[4829]: /usr/sbin/lightdm: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined symbol: g_date_copy

Searching online, I saw this bug report https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=896019 .

Following the discussion in that thread, I started inspecting some GLib files:

ls -il /lib/x86_64-linux-gnu/libglib-2.0.so*
ls -il /usr/lib/x86_64-linux-gnu/libglib-2.0.so*

It turns out that my /lib/x86_64-linux-gnu/libglib-2.0.so.0 was a symlink to /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1, while my /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 was a symlink to /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.1 . One of them must belong to a wrong version.

Which GLib version do I have?

apt list --installed | grep libglib

And the result is libglib2.0–0/unstable,now 2.58.1–2 amd64 [installed].

SOLUTION

It is now clear that when upgrading the libglib2.0–0 package, Debian failed to clean the old one (2.48) completely. As /lib comes before /usr/lib, it is causing this problem. I tried to do dpkg-reconfigure libglib2.0–0, but it didn’t help. So in the end I removed the files under /lib:

rm -f /lib/x86_64-linux-gnu/libglib-2.0.so.0 /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1

CAUSE

Now my lightdm works as expected. How did this happen?

In the bug report, Michael Biebl suspected that the files of an older version of GLib could have been introduced by a third party package. I do not think so. Let’s compare two file lists:

File list of package libglib2.0–0 in stretch of architecture amd64

/lib/x86_64-linux-gnu/libglib-2.0.so.0
/lib/x86_64-linux-gnu/libglib-2.0.so.0.5000.3

/usr/lib/x86_64-linux-gnu/glib-2.0/gio-querymodules
/usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-resources
/usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5000.3
/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.5000.3
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5000.3
/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0.5000.3
/usr/share/doc/libglib2.0-0/AUTHORS
/usr/share/doc/libglib2.0-0/ChangeLog.pre-1-2.gz
/usr/share/doc/libglib2.0-0/ChangeLog.pre-2-0.gz
/usr/share/doc/libglib2.0-0/ChangeLog.pre-2-2.gz
/usr/share/doc/libglib2.0-0/NEWS.gz
/usr/share/doc/libglib2.0-0/NEWS.pre-1-3.gz
/usr/share/doc/libglib2.0-0/README.gz
/usr/share/doc/libglib2.0-0/changelog.Debian.gz
/usr/share/doc/libglib2.0-0/changelog.gz
/usr/share/doc/libglib2.0-0/copyright
/usr/share/lintian/overrides/libglib2.0-0

File list of package libglib2.0–0 in sid of architecture amd64

/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop
/usr/lib/x86_64-linux-gnu/glib-2.0/gio-querymodules
/usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-schemas
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.1
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.1

/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.5800.1
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.1
/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0.5800.1
/usr/share/doc/libglib2.0-0/NEWS.gz
/usr/share/doc/libglib2.0-0/README.md.gz
/usr/share/doc/libglib2.0-0/changelog.Debian.gz
/usr/share/doc/libglib2.0-0/copyright
/usr/share/lintian/overrides/libglib2.0-0

The symlink libglib-2.0.so.0 and the file it links to, used to sit under /lib/x86_64-linux-gnu/ in stretch, but now under /usr/lib/x86_64-linux-gnu/ in sid. This change was introduced in 2.56.0–5. The installation script failed to clean the old ones.

--

--