Watch at Ease看見世界,讀懂生活。

運算技術 · 實用指南

Linux 顯示「cannot open shared object file」?更改函式庫前先證明載入器搜尋了什麼

指定的 .so 可能真的缺少,也可能被實際服務環境隱藏、快取不同或 ABI 不相容。執行 ldconfig、匯出 LD_LIBRARY_PATH、複製檔案或建立連結前,先建立載入器證據帳本。

顯示 DT_NEEDED、搜尋順序、快取、預設路徑和 ELF 候選的載入器圖
示意:變更系統前先證明請求名稱、搜尋環境與候選 ABI。 Watch at Ease

「Error while loading shared libraries」只表示執行期載入器無法滿足指定相依,不能證明系統中沒有同名檔案。實際執行檔、ELF 解譯器、DT_NEEDED、RUNPATH/RPATH、環境、快取、預設目錄、架構與服務或容器命名空間都會影響結果。

把修復視為歸屬判斷:發行版或廠商套件擁有相依時,安裝或修復相符套件;自有建置擁有它時,修正 SONAME 與部署路徑。沒有相容性證據時,不要改全域搜尋路徑或建立跨主要版本連結。

1. 擷取實際執行檔與請求名稱

記錄完整命令、執行路徑、使用者、服務或容器、工作目錄與錯誤。解析包裝程式和符號連結,確保 readelf 檢查送入 execve 的 ELF。

用 readelf -dW 記錄 DT_NEEDED 與 RPATH/RUNPATH,再用 readelf -lW 或 file 確認解譯器與平台,不要依目錄清單猜測。

2. 重建載入器搜尋

從相同執行環境使用解譯器 --list 或適用時的 LD_DEBUG=libs,記錄搜尋目錄和第一個候選或拒絕原因。

比較嵌入路徑、實際 LD_LIBRARY_PATH、快取與預設目錄;systemd、容器、sudo 或 set-user-ID 邊界可使用不同環境。

3. 驗證候選檔與擁有者

檢查每個候選的 ELF 標頭與動態段,匹配位元數、機器、端序、SONAME 與符號版本;連結不能讓不相容 ABI 變相容。

以套件資料庫、廠商清單或建置成品找出擁有者,區分升級移除、舊快取、不完整映像層、錯誤架構與漏裝執行期。

4. 縮小修復範圍並證明乾淨啟動

優先重新安裝或重建擁有元件並修正部署路徑。自有應用可用明確 RUNPATH 或正式設定,避免寬泛的 LD_LIBRARY_PATH。

移除暫時覆寫後從原服務或容器重測,記錄解析物件、啟動、架構與套件版本,並執行真正使用相依的功能。

把請求 SONAME 導向套件或建置擁有者的修復圖
示意:修復擁有函式庫契約的元件,再於沒有全域覆寫的環境重測。 Watch at Ease