.so搜索路径 [英] .so search paths

查看:863
本文介绍了.so搜索路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Linux新手(来自Windows背景).我想了解在运行时如何加载共享对象(.so文件)的详细信息.根据 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries. html 文件/etc/ld.so.conf将目录配置为在运行时搜索.so文件.但是,下面显示的实验似乎表明情况并非如此. /usr/local/lib在/etc/ld.so.conf.d中的.conf文件之一中,但是当我的.so在/usr/local/lib中时,在运行时找不到该文件.相反,/usr/lib不是由/etc/ld.so.conf配置的,但是当我的.so位于/usr/lib中时,它是在运行时找到的. /p>

我想念什么?

谢谢, 戴夫

davids@ds-ub64-7:/$ # Display the .so search path configured in /etc/ld.so.conf
davids@ds-ub64-7:/$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
davids@ds-ub64-7:/$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/mesa
/usr/lib32/mesa
/usr/lib32/alsa-lib
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

davids@ds-ub64-7:/$ # libsotest.so.1 is in /usr/local/lib
davids@ds-ub64-7:/$ ls -la /usr/local/lib/libsotest*
lrwxrwxrwx 1 root   root     14 2012-07-19 08:24 /usr/local/lib/libsotest.so -> libsotest.so.1
lrwxrwxrwx 1 root   root     18 2012-07-19 08:24 /usr/local/lib/libsotest.so.1 ->     libsotest.so.1.0.1
-rwxr-xr-x 1 davids davids 7952 2012-07-19 08:13 /usr/local/lib/libsotest.so.1.0.1

davids@ds-ub64-7:/$ # But when I run an executable that refrs to libsotest.so.1, the loader     doesn't find it.
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory

davids@ds-ub64-7:/$ # Configure loader to display the paths it's searching...it's     searching /usr/lib but not /usr/local/lib
davids@ds-ub64-7:/$ export LD_DEBUG=lib
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
warning: debug option `lib' unknown; try LD_DEBUG=help
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory
davids@ds-ub64-7:/$ export LD_DEBUG=libs
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
      6691: find library=libsotest.so.1 [0]; searching
      6691:  search cache=/etc/ld.so.cache
      6691:  search     path=/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/    lib:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-    gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-    gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu        (system search path)
      6691:   trying file=/lib/tls/x86_64/libsotest.so.1
      6691:   trying file=/lib/tls/libsotest.so.1
      6691:   trying file=/lib/x86_64/libsotest.so.1
      6691:   trying file=/lib/libsotest.so.1
      6691:   trying file=/usr/lib/tls/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/tls/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/tls/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/x86_64/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/tls/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/libsotest.so.1
      6691: 
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory
davids@ds-ub64-7:/$

解决方案

/usr/lib和/lib是硬编码的IIRC.

在ld.conf.so中添加PATH并不是唯一的问题,您必须使用ldconfig(8)重新生成缓存和链接.

您可以使用ldconfig -p检查哪个库在高速缓存中.

I am a Linux novice (coming from a Windows background). I'd like to understand the details of how shared objects (.so files) are loaded at runtime. According to http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html the file /etc/ld.so.conf configures the directories to search for .so files at runtime. However an experiment shown below seems to indicate that isn't the case. /usr/local/lib is in one of the .conf files in /etc/ld.so.conf.d, but when my .so is in /usr/local/lib it is not found at run-time. Conversely /usr/lib is not configured by /etc/ld.so.conf, but when my .so is in /usr/lib it is found at runtime.

What am I missing?

Thanks, Dave

davids@ds-ub64-7:/$ # Display the .so search path configured in /etc/ld.so.conf
davids@ds-ub64-7:/$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
davids@ds-ub64-7:/$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/mesa
/usr/lib32/mesa
/usr/lib32/alsa-lib
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

davids@ds-ub64-7:/$ # libsotest.so.1 is in /usr/local/lib
davids@ds-ub64-7:/$ ls -la /usr/local/lib/libsotest*
lrwxrwxrwx 1 root   root     14 2012-07-19 08:24 /usr/local/lib/libsotest.so -> libsotest.so.1
lrwxrwxrwx 1 root   root     18 2012-07-19 08:24 /usr/local/lib/libsotest.so.1 ->     libsotest.so.1.0.1
-rwxr-xr-x 1 davids davids 7952 2012-07-19 08:13 /usr/local/lib/libsotest.so.1.0.1

davids@ds-ub64-7:/$ # But when I run an executable that refrs to libsotest.so.1, the loader     doesn't find it.
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory

davids@ds-ub64-7:/$ # Configure loader to display the paths it's searching...it's     searching /usr/lib but not /usr/local/lib
davids@ds-ub64-7:/$ export LD_DEBUG=lib
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
warning: debug option `lib' unknown; try LD_DEBUG=help
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory
davids@ds-ub64-7:/$ export LD_DEBUG=libs
davids@ds-ub64-7:/$ /projects/sotest/exe/sotestexe
      6691: find library=libsotest.so.1 [0]; searching
      6691:  search cache=/etc/ld.so.cache
      6691:  search     path=/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/    lib:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-    gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-    gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu        (system search path)
      6691:   trying file=/lib/tls/x86_64/libsotest.so.1
      6691:   trying file=/lib/tls/libsotest.so.1
      6691:   trying file=/lib/x86_64/libsotest.so.1
      6691:   trying file=/lib/libsotest.so.1
      6691:   trying file=/usr/lib/tls/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/tls/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/tls/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/x86_64/libsotest.so.1
      6691:   trying file=/lib/x86_64-linux-gnu/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/tls/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/x86_64/libsotest.so.1
      6691:   trying file=/usr/lib/x86_64-linux-gnu/libsotest.so.1
      6691: 
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot     open shared object file: No such file or directory
davids@ds-ub64-7:/$

解决方案

/usr/lib and /lib are hardcoded IIRC.

And adding a PATH in ld.conf.so is not enougth, you have to regenerate the cache and the links, using ldconfig(8)

You can check which library are in the cache with ldconfig -p.

这篇关于.so搜索路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆