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
が走るように修正しようと思っています。