運算技術 · 實用指南
Linux 顯示「cannot open shared object file」?更改函式庫前先證明載入器搜尋了什麼
指定的 .so 可能真的缺少,也可能被實際服務環境隱藏、快取不同或 ABI 不相容。執行 ldconfig、匯出 LD_LIBRARY_PATH、複製檔案或建立連結前,先建立載入器證據帳本。

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