複数パッケージをインストールする場合はライブラリのパスに気をつけるへの返答の返答

/usr/opt/pkgs/foo-1.0.0/lib/libfoo.so.1
/usr/opt/pkgs/foo-1.0.1/lib/libfoo.so.1
/usr/opt/foo => /usr/opt/pkgs/foo-1.0.1

だったものを

/usr/opt/pkgs/foo-1.0.0/lib/libfoo.so.1
/usr/opt/pkgs/foo-1.0.1/lib/libfoo.so.1
/usr/opt/foo => /usr/opt/pkgs/foo-1.0.0

に変えたとかいう場合はどうでしょうか?

どのライブラリをロードするのかはライブラリのサーチパスに依存します。システムのサーチパスは ld.so.conf で設定しますが、これは環境変数の LIBRARY_PATH でも変更可能です。絶対パスでリンクされるのは /lib/ld.so のみ(linux の場合は /lib/ld-linux.so)です。/lib/ld.so が実行時にライブラリのサーチパスを検索してロードするライブラリを決定します。

例えばサーチパスが

/opt/foo/lib
/opt/pkg/foo-1.0.0/lib
/opt/pkg/foo-1.0.1/lib

の場合は、/opt/foo/lib/libfoo.so.1 がリンクされます。

メジャーバージョンが同じパッケージが複数存在する場合の切り替えは、残念ながらちょっと分かりません。
libfoo.so.x ではなく libfoo.so.x.y.z にリンクできれば可能なんでしょうけど。

ELFの思想的にはメジャーバージョンが同じ場合は後方互換性が保たれるので、問題がおきることはありません。
もし新しいバージョンで問題が起きた場合は、新しいバージョンのライブラリを削除してやれば自動的に古いバージョンのライブラリがロードされるので、問題なく実行されます。既に新しいバージョンのライブラリにリンクしているプログラムがあって、そのプログラムが新しいバージョンの後方互換のない機能を使っていれば失敗します。その場合は新しくコンパイルしなおすか、問題のあるバージョンのライブラリを使うことになるのですが、そのようなケースはまれですね。

メジャーバージョンが異なる場合は、問題なく共存できます。
例えば

/opt/pkgs/foo-1.0.0/lib/libfoo.so.1
/opt/pkgs/foo-2.0.0/lib/libfoo.so.2
/opt/foo => /opt/pkgs/foo-2.0.0

であっても /opt/pkgs/foo-1.0.0/lib をちゃんとライブラリのサーチパスに登録しておけば、libfoo.so.1 にリンクしているプログラムは問題なく実行できるわけです。

折り見てこのネタいただこうと思います(苦笑

僕もELFさんのPHPインストールスクリプト参考にして、自分用の作りましたw

個人的にいはalternativesとかでこの辺もできたら面白いんだけど.

リンクするライブラリはコンパイル時に決定するものなので、切り替えるとしたらヘッダファイルでしょうね。

トラックバック(0)

このブログ記事を参照しているブログ一覧: 複数パッケージをインストールする場合はライブラリのパスに気をつけるへの返答の返答

このブログ記事に対するトラックバックURL: http://blog.bz2.jp/bz2mt/mt-tb.cgi/122

コメント(2)

いちいち記事起こすの面倒だね(苦笑
挫折しました;-(

> ELFの思想的にはメジャーバージョンが同じ場合は後方互換性が保たれるので、問題がおきることはありません。

卓上論ですよね.
例えばバグや脆弱性の修正をしただけでABIは互換なので数字は挙がらない.とかは普通にありますね.
逆に同じABIでもエンバグする(未来の方がだめ)ってことも当然あるわけです.

可能性としてはしょっちゅう起こることではないので,反論材料としては上記は重箱ですけど
経験上そういうことは全然あっても当たり前じゃないかと思います.

はい、僕もそう思います。
新しいバージョンで問題があった場合に、すぐ古いバージョンに戻せるようにしておくのが大事ですね。

ウェブページ

Powered by Movable Type 4.21-ja

このブログ記事について

このページは、masatoが2006年2月28日 15:32に書いたブログ記事です。

ひとつ前のブログ記事は「複数パッケージをインストールする場合はライブラリのパスに気をつける」です。

次のブログ記事は「procmail」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。