Open4
.soファイルの中のシンボル探し
openSUSE Tumbleweedのzypper up でのアップデートを一部ずつちまちまやっていたら、zypper が壊れてしまった。
zypper: symbol lookup error: /lib64/libgio-2.0.so.0: undefined symbol: g_once_init_leave_pointer
/lib64/libgio-2.0.so.0
の中に定義されいないシンボル g_once_init_leave_pointer
があるとのこと。
/lib64/libgio-2.0.so.0 はインストールされている。 nm
コマンドを使ってシンボルを列挙して見よう。
$ nm -D /lib64/libgio-2.0.so.0|grep g_once_init_leave_pointer
U g_once_init_leave_pointer
シンボル g_once_init_leave_pointer
の前にUフラグが付いていて、これは undefined を意味しているらしい。上のエラーの通りだ。
そしてそれは、正常であれば、このファイル内では定義されていなくて、依存している他のライブラリで定義されていることを意味している。
ldd コマンドを使って依存しているライブラリを列挙する。
$ ldd /lib64/libgio-2.0.so.0
linux-vdso.so.1 (0x00007ffe47bd4000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f5877a0f000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f58779ad000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f58779a6000)
libz.so.1 => /lib64/libz.so.1 (0x00007f587798a000)
libmount.so.1 => /lib64/libmount.so.1 (0x00007f587793e000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5877910000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5877600000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f5877869000)
libffi.so.8 => /lib64/libffi.so.8 (0x00007f587785e000)
libblkid.so.1 => /lib64/libblkid.so.1 (0x00007f5877821000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5877d7a000)
いろいろ出てきた。
/lib64/libglib-2.0.so.0 を狙ってみる。
$ nm -D /lib64/libglib-2.0.so.0 | grep g_once_init_
000000000008a5c0 T g_once_init_enter
0000000000024c00 T g_once_init_enter_impl
000000000008a660 T g_once_init_leave
g_once_init_leave
まではあるが g_once_init_leave_pointer
がない。
$ rpm -qf /lib64/libglib-2.0.so.0
libglib-2_0-0-2.78.1-1.1.x86_64
最新版が libglib-2_0-0-2.80.0-2.1.x86_64.rpm だったので 2.78 < 2.80 となり、バージョンが少し低い。これをアップデートしてみる。
rpm -Uvh https://download.opensuse.org/tumbleweed/repo/oss/x86_64/libglib-2_0-0-2
.80.0-2.1.x86_64.rpm
中身を見て見よう。
$ nm -D /lib64/libglib-2.0.so.0 | grep g_once_init_leave
000000000008c4d0 T g_once_init_leave
000000000008c580 T g_once_init_leave_pointer
g_once_init_leave_pointer
がある!
これでzypperコマンドが正常に起動するようになった。
ログインするとコメントできます