[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 メーリングリストの案内