ldconfigは特定のファイルに接続できません

ldconfigは特定のファイルに接続できません

ATLASDockerイメージにNetlibを使用してインストールしましたが、LAPACK実行するたびにldconfig次のエラーが発生します。

ldconfig: Can't link /usr/local/lib//usr/local/lib/libtatlas.so to libtatlas.so
ldconfig: Can't link /usr/local/lib//usr/local/lib/libsatlas.so to libsatlas.so

もちろん、存在しないがシンボリックリンクではない/usr/local/lib//usr/local/lib/libtatlas.soので、なぜこのファイルを見つけようとするのか混乱しています。libtatlas.so

root@cd00953552ab:/usr/local/lib# ls -la | grep atlas
-rw-r--r-- 1 root staff 15242054 Apr 27 08:18 libatlas.a
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libatlas.so
-rwxr-xr-x 1 root staff 17492184 Apr 27 08:18 libsatlas.so
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libtatlas.so

なぜこれが起こり、これを解決したり、このエラーメッセージをオフにしたりする方法はありますか?

編集:これはReadelf出力です。

root@cd00953552ab:/usr/local/lib# eu-readelf -a /usr/local/lib/libatlas.so | grep SONAME
  SONAME            Library soname: [/usr/local/lib/libtatlas.so]

答え1

何らかの理由で、おそらくライブラリの構築方法(より具体的にリンクされている)に関してインストールディレクトリをsonameに保存します。したがって、 libtatlas.sosonameです/usr/local/lib/libtatlas.soldconfig同じディレクトリにある対応するsoname(存在しない場合)にライブラリをリンクしてみてください。ライブラリを探し、対応するsonameを確認し、/usr/local/lib/libtatlas.so(ディレクトリとsoname接続)でリンクを作成する必要があるかどうかを判断し、存在しないため失敗します。/usr/local/lib//usr/local/lib/libtatlas.so/usr/local/lib/libtatlas.so/usr/local/lib/usr/local/lib

この問題を解決する適切な方法は、ライブラリの名前が正しく定義されていることを確認することです。通常、ディレクトリ名などはないと予想します。libtatlas.so.3(バージョンはビルドしているライブラリのABIレベルによって異なります。)ライブラリを再構築するか、正しくビルドされたパッケージを見つける必要があります。

あるいは、編集ライブラリのsonameを使用することもできます。パッチELF:

patchelf --set-soname libtatlas.so /usr/local/lib/libtatlas.so

理想的には、このライブラリで構築されたプログラムを再リンクする必要があります。これにはsonameも含まれています(PatchELFを使用してパッチを適用することもできます)。

進化しているシステムではsonameにバージョンを付けたいのですが、コンテナではこれは重要ではないかもしれません。とにかく、アップグレードのためにコンテナを再構築する必要があります。

答え2

BLASライブラリの特別なケースですATLAS。実際の原因に対する解決策は、パッケージの構築に使用されたmakefileを修正することです。

理由については@Stephen Kittの回答をご覧ください。

しかし--set-soname エラーでは、patchelfpatchelfソリューションは機能しません。

あなたのライブラリパスには「/usr/local」が含まれているので、ソースからビルドされたとします。

ソースコードのルートがあるファイルを確認してください$(SRC)/makes/Make.lib$(SRC)

具体的には、次の行は次のようになります。

LDTRY:
    $(LD) $(LDFLAGS) -shared -soname $(LIBINSTdir)/$(outso) -o $(outso) \
       -rpath-link $(LIBINSTdir)  \
       --whole-archive $(libas) --no-whole-archive $(LIBS)

ここの名前が間違っています-soname $(LIBINSTdir)/$(outso)。これを変更して-soname $(outso)ライブラリを再構築すると、問題が解決しました。

正常にビルドしたら、その行を変更してください$(BUILD)/lib/Makefile。ここでは$(BUILD)、ライブラリが構築されたディレクトリです。その後、make sharedライブラリを構築します。

などのコマンドを使用して、生成されたreadelf -d libtatlas.so | grep soname.soファイルでsonameを確認します。目次セクションを含めないでください。

正しいmakefileが見つからない場合(たとえば、異なるバージョンのmakefileを使用している場合ATLAS)、grep -IR soname変更する場所を見つけてください。

関連情報