Dynamic-Linking

ldd 等效項,當找不到庫時失敗

  • November 12, 2018

假設我在ldd /bin/ls刪除 pthread 庫的情況下執行。我得到

linux-vdso.so.1 (0x00007ffcc3563000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)
libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)
/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)
libpthread.so.0 => not found

返回碼為零。在這種情況下是否有返回錯誤的命令?類似的東西

#!/bin/bash
if [[ ! -z $(ldd ${target} | grep 'not found') ]]; then
  exit 1
fi

ldd在linux上小心;它只是一個bash腳本,至少在舊系統上,它將LD_TRACE_LOADED_OBJECTS=1在其環境中執行給定的程序。

這意味著如果程序有其他解釋器/lib{64,32}/ld-*,即使您不是故意的,該程序也會以您的目標作為其第一個參數執行。如果您ldd在某個其他使用者擁有的執行檔上執行,則該使用者將擁有

您可以使用 . 檢查 ELF 標頭中定義的解釋器readelf -l "$target" | grep interpreter

在較新的系統上,ldd已更改為將目標作為參數傳遞給從“好”解釋器列表中獲取的解釋器(例如/lib64/ld-linux.so.2 target);我覺得這並不令人信服,但如果這足夠安全,則由你來決定。

如果您發現所有這些都可以接受,那麼最簡單的方法是:

if ldd "$target" | grep -q 'not found'; then
  echo >&2 "$target is missing dependencies"
  exit 1
fi

如果在“跟踪模式”中呼叫(從 ldd 開始),linux 上的預設動態載入程序將始終以 0 狀態退出,並且無法通過命令行開關或環境變數來更改它;您必須更改其原始碼。

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