Dynamic-Linking
如何確定執行檔在哪裡搜尋共享庫?
我知道我有庫,但執行檔找不到它。如果我知道它在哪裡搜尋,我可以創建一個符號連結,它希望在其中找到 lib。
$ ~/Apps/simutrans/simutrans /home/dan/Apps/simutrans/simutrans: error while loading shared libraries: libbz2.so.1.0: cannot open shared object file: No such file or directory $ locate libbz2 ... /lib/x86_64-linux-gnu/libbz2.so.1 /lib/x86_64-linux-gnu/libbz2.so.1.0 /lib/x86_64-linux-gnu/libbz2.so.1.0.4 /usr/lib/x86_64-linux-gnu/libbz2.a /usr/lib/x86_64-linux-gnu/libbz2.so ...
顯然,執行檔不
/etc/ld.so.conf*
用於查找庫;如果是,那麼它會找到 lib:$ cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf # Multiarch support /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu
使用 來檢查執行檔
readelf
,如係統在哪裡搜尋動態庫?, 不顯示RUNPATH
在需要找到庫時會顯示的條目。
假設您的程序與目前使用者一起執行(沒有 setuid 等),您可以使用
strace
來獲取此資訊,例如,strace -o foo.out ~/Apps/simutrans/simutrans
並在輸出文件中查找
open
呼叫。