11/3付けでBoost 1.37.0がリリースされました。今年に入って頻繁なバージョンアップが行われています。(1.35, 1.36, 1.37といずれも2008年)
1.37.0のRPMパッケージ作成を行いました。CentOS 5ですが、GCC 4.x系の環境なら同じように出来るかと思います。RPMパッケージ作成方法は、CentOS用RPMバイナリパッケージのページに記述しました。
普段意識していなかったSONAME、ELFヘッダーを読むコマンドについて
SONAMEとreadelfコマンド
以前、書籍「Linkers & Loaders」を読んだときにちょっと出てきていたので記憶にありましたが、自分で作るプログラムでは使用していませんでした。
動的リンクライブラリファイル(ELF形式)を使ったリンク時に、メジャーバージョン番号までリンク情報に含めると、バイナリ互換を失うバージョンアップ(つまりメジャーバージョン番号の変更)があると、実行時にリンクが失敗するため、実際にプログラムが実行されてしまい、途中で挙動不審になることが防げます。
ライブラリファイルが持つSONAMEは、readelfコマンドで確認できます。
$ readelf -d libboost_date_time.so
:
0x0000000e (SONAME) Library soname: [libboost_date_time.so.4]
:
アプリケーションは、リンク時に -lboost_hoge と指定しても、実際にはlibboost_hoge.soが持つSONAMEであるlibboost_hoge.so.4とリンクされる設定がバイナリファイルに記録されます。実行時には、バイナリファイルに記録されたSONAMEを持つライブラリファイルが見つからないとエラーとなります。
しかし、Boostでは、バイナリ互換か否かがバージョンアップ時によく見えない(明示的にドキュメントされていない)のと、Boostのバージョン番号がバイナリ互換とは無関係に付けられているので、単純にはいきません。
RedHat(Fedora)のboost RPMパッケージを見ると、SONAMEにバージョン番号を独自に振っています。(例:boost_date_time.so.3 )