Dynamic-Linking

如何確定執行檔在哪裡搜尋共享庫?

  • December 12, 2015

我知道我有庫,但執行檔找不到它。如果我知道它在哪裡搜尋,我可以創建一個符號連結,它希望在其中找到 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呼叫。

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