rpmで依存関係がうまく解決できない


RPMでパッケージをインストールしようとした時に依存関係があるパッケージは入ってるのに何故かインストールできないという状況に遭遇しました。

[root@localhost rpms]# rpm -Uvh firefox-91.10.0-1.el7.centos.x86_64.rpm 
error: Failed dependencies:
	libdbus-1.so.3(LIBDBUS_1_3)(64bit) is needed by firefox-91.10.0-1.el7.centos.x86_64

[root@localhost rpms]# ls -la /lib64/libdbus-1.so.3
lrwxrwxrwx. 1 root root 18 Jun 30 21:53 /lib64/libdbus-1.so.3 -> libdbus-1.so.3.7.4

[root@localhost rpms]# rpm -qf /lib64/libdbus-1.so.3
dbus-libs-1.6.12-17.el7.x86_64

firefoxは「libdbus-1.so.3」というファイルを要求していますが、そのファイルは「dbus-libs」というパッケージに所属しているように見えて、依存関係は解決しているように見えます。

しかし、依存関係のエラーをよく見てみましょう。

libdbus-1.so.3(LIBDBUS_1_3)(64bit) is needed by firefox-91.10.0-1.el7.centos.x86_64

何やらlibdbus-1.so.3はlibdbus-1.so.3でも「LIBDBUS_1_3」に対応したlibdbus-1.so.3を求めているようです。

ちょっと脱線。

Linuxのプログラムでは共用ライブラリを使う際に必要な機能を「シンボル」という呼び名で呼び出します。

ライブラリが持っているシンボルのリストは次のように確認する事ができます。

[root@localhost rpms]# readelf -s /lib64/libdbus-1.so.3 | head -n 10
Symbol table '.dynsym' contains 355 entries:
  Num:    Value          Size Type    Bind   Vis      Ndx Name
    0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
    1: 0000000000006a78     0 SECTION LOCAL  DEFAULT    9 
    2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getenv@GLIBC_2.2.5 (2)
    3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sigprocmask@GLIBC_2.2.5 (2)
    4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __snprintf_chk@GLIBC_2.3.4 (3)
   (以下略)

最近では(昔がどうだったかは知りませんが)、共用ライブラリの互換性を高める為、1つのライブラリに古いバージョンの機能を一緒に収録するという事が行われます。その際にこのシンボルにバージョンを加える事でバージョンに対する機能を区別します。

今回の場合「LIBDBUS_1_3」というバージョンのシンボルを持った「libdbus-1.so.3」をrpmが要求しています。

試しにこのバージョンが入ったシンボルがあるか確認してみると…

[root@localhost rpms]# readelf -s /lib64/libdbus-1.so.3 | grep LIBDBUS_1_3
[root@localhost rpms]# 

何も出てきません。つまりこのライブラリは「LIBDBUS_1_3」の機能を持っていない事になります。その為依存関係が解決できないとエラーになるのです。

という事で「LIBDBUS_1_3」に対応した新しい「dbus-libs」をインストールする必要があります。

ちなみに対応していれば下記のような表示になります。

nogisawa@localhost:~$ readelf -s /usr/lib/x86_64-linux-gnu/libdbus-1.so.3 | grep LIBDBUS_1_3 | head -n 3
  123: 0000000000022400   412 FUNC    GLOBAL DEFAULT   15 dbu[...]@@LIBDBUS_1_3
  128: 0000000000010fb0   111 FUNC    GLOBAL DEFAULT   15 dbu[...]@@LIBDBUS_1_3
  130: 000000000001d1b0    68 FUNC    GLOBAL DEFAULT   15 dbu[...]@@LIBDBUS_1_3
 (略)

ちなみにLIBDBUS_1_3がどのバージョンから採用されているのか確認してみると…

$ zcat /usr/share/doc/libdbus-1-3/NEWS.gz | less
(一部抜粋)
Summary of major changes since 1.8.0:
(略)
• On platforms with ELF symbol versioning, all public symbols
  are versioned LIBDBUS_1_3.

どうやら1.8.0以上のバージョンでLIBDBUS_1_3が収録されたようです。

という事でlibdbusを1.8.0以上のバージョンにアップグレードしましょう。