http://gihyo.jp/admin/clip/01/fdt/201202/17
2012年2月17日
後藤大地
FreeBSD, PCRE, 正規表現, ライブラリ
この記事を読むのに必要な時間:およそ 1 分
portupgrade(8)やportmaster(8)を使って「libpcre.so.0」を「/usr/local/lib/compat/pkg/」に退避させた場合,すでにインストールされているライブラリやアプリケーションはこの古いライブラリを参照し続けることになります。こうしたソフトウェアのライブラリ参照先を新しい「/usr/local/lib/libpcre.so.1」に向けるには,依存しているソフトウェアをすべて再構築する必要があります。
portupgrade(8)を使っている場合,次の操作で実施できます。
portupgrade -rf pcre
portmaster(8)を使っている場合には次の操作で同様の効果が得られます。
env LOCALBASE=/usr/local portmaster -w -D -G --no-confirm -r pcre
確認しながら確実に作業したいということであれば,次のように一旦手動で「libpcre.so.0」ファイルを「/usr/local/lib/compat/pkg/」へコピーしてからportmaster(8)を実行すれば良いでしょう。
mkdir -p /usr/local/lib/compat/pkg cp /usr/local/lib/libpcre.so.0 /usr/local/lib/compat/pkg/ portmaster -D -G --no-confirm -r pcre
システムにインストールされているサードパーティ製アプリケーションやライブラリが「libpcre.so.0」へ依存しているかどうかは,例えば次のようなワンライナーで確認できます。報告される数が0以外であれば,その数だけまだ依存するアプリケーションやライブラリが残っていることになります。その場合,fgrep以降のコマンドをlessなどに置き換えて,依存しているアプリケーションやライブラリを特定して,個別にアップデートを実施します(以下のワンライナーはsh,bash,zshなどsh系の文法を採用しているシェルを想定しています。cshやtcshを使っている場合には一旦shを起動するなどして作業してみてください)。
# sh ldd /usr/local/bin/* 2> /dev/null | fgrep "pcre.so.0" | wc -l find /usr/local/lib -name "*so" -exec ldd '{}' 2> /dev/null ';' | fgrep "pcre.so.0" | wc -l
ただし一点上記ワンライナーには注意が必要です。Flashプラグインをインストールしてある場合,この方法ではldd(1)経由でFlashの設定ダイアログが起動してきます。これはldd(1)のバグではなくこのような動作をすることになっているためです。その場合,一旦バイナリを別の場所に移動させるなどして回避してみてください。
「libpcre.so.0」へ依存するアプリケーションやライブラリがひとつもなくなったら,「/usr/local/lib/compat/pkg/libpcre.so.0」を削除しても問題ありません。portupgrade(8)やportmaster(8)を使っている場合「/usr/local/lib/compat/pkg/」に互換性確保のためのライブラリがたまっていきますので,それが嫌な場合には,ここで紹介したような方法で既存のアプリケーションやライブラリが新しいバージョンを使用するようにしてみてください。