Zenn
Open4

.soファイルの中のシンボル探し

NyohoNyoho

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 があるとのこと。

NyohoNyoho

/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)

いろいろ出てきた。

NyohoNyoho

/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 がある!

ログインするとコメントできます