/usr/ccs/bin/

ld

RPATH

各 binary には RPATH (Runtime PATH) が埋めこまれており, 実行時に必要となる shared library を RPATH から検索します。 RPATH の値は,検索対象としたい path を `:' で区切って指定します。

Binary に RPATH を埋めこむには,環境変数 LD_RUN_PATH に埋めこみたい RPATH の値を指定した環境で binary を build (link) するか, link option に -R で埋めこみたい RPATH を直に指定します。 LD_RUN_PATH が設定されている環境でも,-R が指定されると -R の値が優先されます。

その binary に埋めこまれている RPATH は dump で,また その binary が dynamic link している shared library は ldd で 確認することができます。

LD_RUN_PATH

というわけで,自ら binary を build する場合,環境変数 LD_RUN_PATH を設定します。たとえば,freeware な library を /opt/lib に install していて,それを link したい場合,

$ LD_RUN_PATH=/opt/lib:/usr/openwin/lib:/usr/dt/lib  ld -L/opt/lib ...

などとして link を行います。ld ではなく gcc を用いて link する 場合でも,この方法で O.K. です。

ほとんどの場合に同じ RPATH を使うときは,shell の RunCom file などで LD_RUN_PATH を指定しておいても問題ありません。

-R

ただし,一部の GNU な freeware などでは,configure 時にわざわざ -R/usr/openwin/lib を Makefile に書きこんでくれる ものがあります。これによって -R option が指定された ことになるので,せっかく LD_RUN_PATH を指定していても 無視されてしまいます。

なので,Makefile(s) (各 subdirectory に存在します) 内の -R を 消してまわるか (これは現実的ではありません),使用したい他の RPATH を -R で指定することになります。

$ LDFLAGS='-L/opt/lib:/usr/openwin/lib -R/opt/lib:/usr/openwin/lib' make

なお,-R/foo/lib:/bar/lib-R/foo/lib -R/bar/lib は どちらも同じとして扱われます。

LD_LIBRARY_PATH とか crle とか

RPATH は各 binary 毎に,その binary で使用したい library が存在する path を指定するものです。その binary が使用する library は,その binary を build した人間 (管理者など) が把握しておくべきことであり,実行環境も その時点で想定されているものです。

環境変数 LD_LIBRARY_PATH や,crle (BSD系 OS で用意されている ldconfig に相当するものです) はこの前提を壊してしまう 可能性があり,個人的には できるだけ使うべきではないと思います。これらを 設定することにより,build した人間が想定した shared library とは別の同名の shared library が dynamic link されてしまうことがあるからです。

そもそも「その binary が使用する library」というのは,その binary 固有の 情報であり,ユーザ単位 (LD_LIBRARY_PATH) やホスト単位 (crle) で設定すべきではないと考えます。

ただし,source が公開されておらず binary 形式で配布されている freeware を使用する場合,LD_LIBRARY_PATH などで RPATH を解決する必要がある場合があります。この場合は wrapper script を作成し, その中でのみ LD_LIBRARY_PATH を設定するのがよいでしょう。

というか, 「binary ごとに search path を変えられない枠組なんてダセぇ」 と私が思っているだけ,という話はあります,はい。

最後に,それぞれの用途に関する説明を docs.sun.com より引用しておきます。

LD_LIBRARY_PATH
アプリケーションを強制的にローカルな依存関係に結合するといった デバッグの目的に適しています。
crle
正しい実行パスで作成されなかったアプリケーションについて 検索パスを設定する場合に便利です。

つまり crle が必要となるってことは,そもそも「正しい実行パスで 作成され」てないってことですわね。

See Also

 
[Powerd by Sun] [Solaris.RogueLife.org] [Valid XHTML 1.0]
Copyright © 2001 -- tsumura@tomo.gr.jp