Linux使用笔记:Linux下动态链接库配置

Easwy尝试telent一个远端设备时,遇到下面的提示(ssh也遇到同样的错误):

/usr/local/bin/cli: error while loading shared libraries: libAbc.so: cannot open shared object file: No such file or directory 

在这个设备里,由xinetd来启动in.telnetd,而in.telnetd则调用/usr/local/bin/cli来做为登录程序。看上述提示,应该是in.telnetd在启动/usr/local/bin/cli时找不到动态链接库。

首先用ldd命令查看一下/usr/local/bin/cli所使用的动态链接库:

$ ldd /usr/local/bin/cli
linux-vdso32.so.1 =  (0x00100000)
libAbc.so => /usr/local/lib/libAbc.so (0x0fdfc000)
libreadline.so.5 => /lib/libreadline.so.5 (0x0f376000)
libncurses.so.5 => /lib/libncurses.so.5 (0x0f337000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x0f24e000)
libm.so.6 => /lib/libm.so.6 (0x0f17a000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0f14a000)
/lib/ld.so.1 (0x48000000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x0efaa000)> 

从上面的命令输出可以看到,cli程序的确会调用libAbc.so这个库,不过上面的输出中,这个库已经被找到了,它对应着文件/usr/local/lib/libAbc.so。考虑到在shell中已经设置了LD_LIBRARY_PATH环境变量,在此环境变量中增加了/usr/local/lib目录,那么是不是xinetd在启动in.telnetd时没有传递此环境变量呢?

于是修改/etc/xinetd.d/telnet,在里面增加一行:

env = LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib 

再次telnet,还是显示上述错误。似乎是in.telnetd在启动cli时没有传递上述环境变量。

幸好还有一个方法来指定动态链接库的位置。

Easwy在目录/etc/ld.so.conf.d中新增加一个文件cli.conf,内容是:

$  cat cli.conf 
/usr/local/lib 

然后再以root身份执行一下ldconfig命令。现在再telnet或ssh,就不会出现上述错误提示了。

/usr/ldconfig命令会读取命令行参数、/etc/ld.so.conf配置文件以及/lib和/usr/lib目录,为动态链接器ld.sold-linux.so生成所需的链接和缓存信息。也就是说,如果不修改任何配置,只有位于/lib和/usr/lib目录的库才能被动态链接器使用。Easwy上面的修改新增了/usr/local/lib目录,并且使用/sbin/ldconfig命令重新生成了缓存,使动态链接器可以引用上述目录的库。这样就解决了此问题。

因此,在你也遇到类似的错误时,如果有root权限,就可以用这种方法来解决;如果没有root权限,那就只能设置一下LD_LIBRARY_PATH环境变量了。

更多内容,请阅读易水博客上的其它文章。

“Linux使用笔记:Linux下动态链接库配置”的一个回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注