Dynamic-Linking
ldd 等效項,當找不到庫時失敗
假設我在
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 狀態退出,並且無法通過命令行開關或環境變數來更改它;您必須更改其原始碼。