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以上のバージョンにアップグレードしましょう。