ldd 是檢查可執行檔或共享庫動態依賴關係的標準工具,本質是設定環境變數 LD_TRACE_LOADED_OBJECTS=1 後執行動態連結器 /lib/ld-linux.so.*。本文詳細說明參數用法、環境變量原理、庫搜尋順序、輸出解讀與常見問題排查。
ldd [選項] 檔案...
# 參數
--version # 顯示版本
-v, --verbose # 詳細輸出 (含符號版本)
-d, --data-relocs # 執行資料重定位,報告缺失目標 (僅 ELF)
-r, --function-relocs # 執行函數重定位,報告缺失目標與函數 (僅 ELF)
-u, --unused # 顯示未使用的直接依賴
--help # 使用說明
# 手動模擬 ldd 行為
export LD_TRACE_LOADED_OBJECTS=1
ls /usr
# 輸出與 ldd ls 相同
unset LD_TRACE_LOADED_OBJECTS
ls /usr # 恢復正常執行
相關環境變數:
LD_TRACE_LOADED_OBJECTS=1:觸發依賴列印 (必要)。LD_WARN:-d 對應。LD_BIND_NOW:-r 對應 (立即綁定)。LD_VERBOSE:-v 對應。LD_DEBUG:除錯輸出 (如 LD_DEBUG=libs ldd ls)。$ ldd /bin/bash
linux-vdso.so.1 => (0x00007ffc12345000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f8e12345000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e12140000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e11d80000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8e12560000)
=> 左側:所需庫 (soname);右側:實際解析路徑與載入位址。not found:依賴缺失,**程式無法啟動**。linux-vdso.so.1:虛擬動態共享物件 (vdso),核心提供的用戶態系統呼叫加速介面,無實體檔案。/lib64/ld-linux-x86-64.so.2:動態連結器本身。-Wl,-rpath)。RUNPATH 受 LD_LIBRARY_PATH 影響,RPATH 不受。ldconfig 建立的快取索引,含標準路徑 (/lib, /usr/lib) 及 /etc/ld.so.conf.d/*.conf 設定的路徑。若連結時加 -z nodeflib 則跳過。/lib, /usr/lib (及架構專用 /lib64, /usr/lib64)。/lib64/ld-linux-x86-64.so.2 --list /bin/ls
# 或
/lib/ld-linux.so.2 --list /bin/bash # 32 位
| 現象 | 原因 | 解決 |
|---|---|---|
| ldd 輸出 "not a dynamic executable" | 靜態編譯、腳本檔、非 ELF 格式 | file 確認類型;靜態編譯無動態依賴 |
| 顯示 "not found" | 缺少庫、路徑未在搜尋順序中 | 安裝套件、設定 LD_LIBRARY_PATH、執行 ldconfig、修正 rpath |
| 版本衝突 (GLIBC_2.29 not found) | 編譯環境 GLIBC 版本高於執行環境 | 降級編譯工具鏈、靜態鏈結 glibc、或升級目標系統 |
| ldd 無法工作於 a.out 格式 | 極舊格式不支援 | 重新編譯為 ELF |