科技 · 實用指南
ld.so 顯示「object from LD_PRELOAD cannot be preloaded」?先找出注入者,再修改程式庫
警告只證明動態載入器拒絕了被要求的物件,沒有說明誰提出要求或為何失敗。先保留命令、追查所有預載來源、比較執行檔與物件的 ELF 身分,再只改真正負責的設定。

訊息由動態載入器在程式完整啟動前輸出,表示附加物件被要求卻遭忽略;它不能證明所有共享程式庫都遺失,也不能證明前景程式建立了要求。
建立「擁有者到物件」證據帳本:先確認來自程序環境、啟動器、服務或 /etc/ld.so.preload,再依路徑、ELF 身分、映射與安全執行證據分流。
1. 固定警告與執行情境
保存完整 ld.so 訊息、物件字串、括號原因、命令、執行檔路徑、身分、目錄與時間;cannot open、failed to map 與安全模式移除是不同結論。
只有在安全時才重現一次,並記錄是 shell、包裝器、服務、容器入口或特權程式。不要先重裝尚未證明擁有者的程式庫。
2. 找出所有預載擁有者
檢查程序環境、shell 啟動檔、包裝器、服務 Environment/EnvironmentFile 與容器設定;另查 /etc/ld.so.preload,它會全系統生效。
若 unset LD_PRELOAD 後仍警告,代表存在另一擁有者,不是載入器必定故障。編輯前保留每個值及來源。
3. 分類路徑、存取與物件身分
依載入器解析方式核對字串,記錄存在、類型、擁有者、權限與掛載環境。目錄、斷鏈、不可讀檔或被分隔符拆開的字串都不是有效物件。
以 file 和 readelf 比較執行檔與物件的 ELF 類別、資料編碼、OS/ABI 與機器欄位;不要為了檢查而執行不可信物件。
4. 分開映射、重新定位與安全執行
路徑與身分相符後,在相同非特權測試收集載入器診斷,查映射、相依、重新定位、符號或版本,不要全當成缺檔。
set-ID 或帶 capability 的程式會限制 LD_PRELOAD;不要削弱權限或把任意物件複製進可信目錄來繞過。
5. 修復擁有者並驗證
只修正已證明的 shell、包裝器、服務、容器或 /etc/ld.so.preload;只有證明套件擁有物件且 ABI 相符後才安裝或還原。
對同一執行檔先做無預載測試,再測需要的已驗證物件;警告消失、載入狀態與功能正確且其他程序不變才通過。
