stz2012/libarib25

ldconfig を実行すると libarib25.so.0 がデグレてしまう可能性がある問題

eternalharvest opened this issue · 1 comments

ldconfig を実行すると libarib25.so.0 がデグレてしまう問題

私が以前書いた CMake へのマイグレーションパッチがそもそもの原因です。大変ご迷惑をおかけて申し訳ありません。ごめんなさいm(_ _)m。症状としては、ldconfig コマンドを実行すると意図せずして古いライブラリにリンクされる可能性があという問題です。

以前取り込んでいただいたチェンジセット以降 libarib25.so の機能自体にはほとんど変更がなく、仮にデグレてしまったとしても現時点では実害はほぼないと思います。
また、前回の CMake マイグレーションパッチでは make install を実行しても ldconfig が自動で実行されることはありません。また、CMake の機能によりインストール時点では適切にシンボリックリンクが張られるため問題は発生しません。

問題が発生するのは、過去に libarib25 をインストールしたことがある環境で、新たに最新の libarib25 を
インストールした後 ldconfig を実行した場合のみです。ldconfig が実行されるまで問題が発覚しない恐れもあり、問題の発見が遅れる可能性があるので注意が必要です。

再現方法

以前に libarib25 をインストールしたことのある環境などで、すでに libarib25.so.0.2.5 ファイルが以下のように存在している状態を想定します。

ubuntu@localhost:~$ ls -l /usr/local/lib
lrwxrwxrwx 1 root root     14  6月  7 02:20 /usr/local/lib/libarib25.so -> libarib25.so.0
lrwxrwxrwx 1 root root     22  6月  7 02:30 /usr/local/lib/libarib25.so.0 -> libarib25.so.0.2.5
-rwxr-xr-x 1 root root 179392  6月  7 02:11 /usr/local/lib/libarib25.so.0.2.5

CMake に移行後のリビジョンを Git でチェックアウトしてビルドする。

ubuntu@localhost:~$ mkdir ~/work/
ubuntu@localhost:~/work$ git clone https://github.com/stz2012/libarib25.git
ubuntu@localhost:~/work$ cd libarib25
ubuntu@localhost:~/work/libarib25$ git checkout 741377f65a7ca1482e47d78cfecc8f3d5802b537

ubuntu@localhost:~/work/libarib25$ mkdir build
ubuntu@localhost:~/work/libarib25$ cd build
ubuntu@localhost:~/work/libarib25/build$ cmake ..
ubuntu@localhost:~/work/libarib25/build$ make
ubuntu@localhost:~/work/libarib25/build$ sudo make install

この時点で /usr/local/lib 配下は以下のようになっている。

ubuntu@localhost:~$ ls -l libarib*
-rw-r--r-- 1 root root  45176  6月  7 02:30 libarib25.a
lrwxrwxrwx 1 root root     14  6月  7 02:20 libarib25.so -> libarib25.so.0
lrwxrwxrwx 1 root root     22  6月  7 02:30 libarib25.so.0 -> libarib25.so.stz-0.2.5
-rwxr-xr-x 1 root root 179392  6月  7 02:11 libarib25.so.0.2.5
-rwxr-xr-x 1 root root  45424  6月  7 02:30 libarib25.so.stz-0.2.5

CMake の機能によってシンボリックリンクは今回インストールした libarib25.so.stz-0.2.5 に向けられている。これは正しい状態ですが、CMake の機能によって偶然にも正しい状態になっているだけです。
この状態で、以下のように ldconfig を実行する。

ubuntu@localhost:~$ sudo ldconfig

/usr/local/lib 配下のシンボリックリンクが ldconfig により更新され、旧バージョンに向いてしまう。依然として libarib25.so.0 にリンクされている b25 コマンドやその他のアプリケーションは現在のところ正常に動作し続けるが、このまま状態は将来的にあまり良くない結果を招くかもしれない。また、もとからあった libarib25.so.0.2.5 が著しく古い場合等では意図せずして古いバージョンを使用し続けることになるので注意が必要です。

ubuntu@localhost:~$ ls -l libarib*
-rw-r--r-- 1 root root  45176  6月  7 02:30 libarib25.a
lrwxrwxrwx 1 root root     14  6月  7 02:20 libarib25.so -> libarib25.so.0
lrwxrwxrwx 1 root root     18  6月  7 03:36 libarib25.so.0 -> libarib25.so.0.2.5
-rwxr-xr-x 1 root root 179392  6月  7 02:11 libarib25.so.0.2.5
-rwxr-xr-x 1 root root  45424  6月  7 02:30 libarib25.so.stz-0.2.5

原因

この問題の根本原因は、CMake マイグレーションパッチでバージョン情報を表示する部分でいわゆるバージョンを明確にするために、stz- プレフィックスをつけたことによる副作用で、共有ライブラリの名前にも stz- が付いてしまったことによります。
これによって ldconfig が解釈できないバージョン名となってしまったため、libarib25.so.0 のリンクが ldconfig の解釈できる最も最新のバージョンに向いてしまうこととなったということのようです。

進捗状況

現在、パッチを書いて検証中です。できるだけはやく修正をプルリク出したいと思います。

方針としては、現在 libarib25.so.stz-0.2.5 としてインストールされてしまっているファイル名を libarib25.so.0.2.5 という名前でインストールされるように修正し、b25 コマンド等実行時に表示されるバージョン名には引き続き stz- プレフィックスを残したいと考えています。

また、make install 実行時に自動で ldconfig が走るように修正しようと思っています。