Ld

ldconfig 無法連結到特定文件

  • February 25, 2019

我在 Docker 映像中安裝ATLAS(使用 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]

出於某種原因,可能與庫的建構方式(更具體地說,連結)有關,他們將安裝目錄儲存在他們的 soname 中:因此libtatlas.so的 soname 是/usr/local/lib/libtatlas.so. ldconfig嘗試將庫連結到它們的 soname,如果它不存在,則在同一目錄中:它找到/usr/local/lib/libtatlas.so,檢查它的 soname,確定需要從/usr/local/lib//usr/local/lib/libtatlas.so(目錄和 soname 連接)到的連結/usr/local/lib/libtatlas.so,並且失敗,因為/usr/local/lib/usr/local/lib沒有’不存在。

解決此問題的適當方法是確保正確定義庫的 soname。通常我希望libtatlas.so.3等沒有目錄名稱(版本取決於正在建構的庫的 ABI 級別)。您可能需要重建庫,或找到正確建構的包…

或者,您可以使用PatchELF編輯庫的 soname :

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

理想情況下,您應該重新連結使用此庫建構的程序,因為它們也會嵌入 soname(您也可以使用 PatchELF 修補它)。

在一個不斷發展的系統中,您確實希望在 soname 中指定一個版本,但在容器中這可能無關緊要——無論如何您都應該重建容器以進行升級。

引用自:https://unix.stackexchange.com/questions/361627