torutkのブログ

ソフトウェア・エンジニアのブログ

Boost 1.37.0のRPMパッケージ作成メモ

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形式)を使ったリンク時に、メジャーバージョン番号までリンク情報に含めると、バイナリ互換を失うバージョンアップ(つまりメジャーバージョン番号の変更)があると、実行時にリンクが失敗するため、実際にプログラムが実行されてしまい、途中で挙動不審になることが防げます。

libboost_hoge.so に対して、SONAMEは、libboost_hoge.so.2 のように付けている

ライブラリファイルが持つ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 )