btoメモ

なんか適当に書く

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

/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とかでこの辺もできたら面白いんだけど.

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