如何确定可执行文件在何处搜索共享库?

如何确定可执行文件在何处搜索共享库?

我知道我有该库,但可执行文件找不到它。如果我知道它在哪里搜索,我可以在它期望找到该库的地方创建一个符号链接。

$ ~/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*查找库;如果是,那么它就会找到该库:

$ 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需要查找库时会显示的条目。

答案1

假设您的程序以当前用户运行(没有 setuid 等),您可以使用strace获取此信息,例如

strace -o foo.out ~/Apps/simutrans/simutrans

并在输出文件中查找open调用。

相关内容