各 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 で 確認することができます。
というわけで,自ら 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 を指定しておいても問題ありません。
ただし,一部の 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 は どちらも同じとして扱われます。
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 より引用しておきます。
つまり crle が必要となるってことは,そもそも「正しい実行パスで 作成され」てないってことですわね。