当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.so和ld-linux.so生成所需的链接和缓存信息。也就是说,如果不修改任何配置,只有位于/lib和/usr/lib目录的库才能被动态链接器使用。Easwy上面的修改新增了/usr/local/lib目录,并且使用/sbin/ldconfig命令重新生成了缓存,使动态链接器可以引用上述目录的库。这样就解决了此问题。
因此,在你也遇到类似的错误时,如果有root权限,就可以用这种方法来解决;如果没有root权限,那就只能设置一下LD_LIBRARY_PATH环境变量了。
更多内容,请阅读易水博客上的其它文章。
受教了