[FreeBSD-users-jp 96325] Re: amd64でi386の同名ライブラリがロードできない
zen-freebsd-ml @ suzuki.que.ne.jp
zen-freebsd-ml @ suzuki.que.ne.jp
2018年 10月 10日 (水) 12:30:14 UTC
内藤 様
鈴木@葛飾区です。
> 私も同じ認識でいましたが、どうやら DT_RUNPATH が共有ライブラリ内にあると、
> DT_RPATH は使われないので、LD_32_LIBRARY_PATH が優先されるようです。
> rtld(1) のマニュアルに優先順として書かれていました。
>
> ので、最初に私が DT_RPATH を見ているからだと言っていたのが誤りで
> DT_RUNPATH を見ていたからが正しいようです。
なるほど。読み方が浅かったようです。
いろいろありがとうございました。
とりあず、これまでのまとめてとしてはこんな感じでしょうか。
・プログラムやライブラリ(.so)にRPATHが指定されている場合は、ldconfig
による指定よりもRPATHで(プログラムのリンク時に)指定されている
/usr/local/lib などが優先される。
・この場合、/usr/local/lib32/compatなど32bit用としてldconfig(rc.confの
ldconfig32_paths) で指定したディレクトリに32bit用のライブラリを配置
しても、同じ名前の64bit用ライブラリ(libpq.so.5など)が/usr/local/lib
に存在すると、プログラム実行時やldd実行時には32bit用ではなく64bitの
ライブラリを先に見つけてしまい、実行エラーになる。
・プログラムでRPATHが設定されていてもDT_RUNPATHがさらに設定されている
場合、もしくはLD_LIBRARY_PATH_RPATH にyY1のいずれかが設定されている
場合は、LD_32_LIBRARY_PATHで32bitライブラリのディレクトリを設定して
おけば32bitのライブラリを正しくリンクしてくれる。
(私が試した限りでは、ほとんどがLD_32_LIBRARY_PATHでokでした)
/etc/login.confに以下の設定を追加してLD_32_LIBRARY_PATHを設定
default:\
:setenv=LD_32_LIBRARY_PATH=/usr/lib32\c/usr/local/lib32/10.4\c/usr/local/lib32/compat:\
〜以下省略〜
※ LD_32_LIBRARY_PATHで複数のディレクトリを指定する場合は:で接合する
が、login.confでは \c に置き換える必要あり。
・LD_32_LIBRARY_PATHが効かない場合は /etc/libmap32.conf でライブラリの
マッピングを行う。
(書き方の例)
# /usr/local/ruby18/bin/rubyに適用
[/usr/local/ruby18/bin/ruby]
libxml2.so.2 /usr/local/lib32/10.4/libxml2.so.2
# /usr/local/ruby18ディレクトリ以下のすべてのプログラムに適用
[/usr/local/ruby18]
libxml2.so.2 /usr/local/lib32/10.4/libxml2.so.2
libpq.so.5 /usr/local/lib32/10.4/libpq.so.5
libintl.so.8 /usr/local/lib32/10.4/libintl.so.8
# リマップするファイルをディレクトリだけ指定してできれば良いが、
# これはダメだった。
[/usr/local/ruby18]
/usr/loca/lib/ /usr/local/lib32/10.4/
/usr/loca/lib/* /usr/local/lib32/10.4/*
/etc/libmap32.confではライブラリファイルを列挙しないといけないような
ので、たくさんある場合は LD_32_LIBRARY_PATH が簡単。
・今回は試しませんでしたが、ports/packages の chrpath を使って rpath
を書き換えるという方法もあり。
---
すずき
freebsd-users-jp メーリングリストの案内