2010-04-07 70 views
5

我有一个共享对象(libxyz.so)。鉴于LD_LIBRARY_PATH,如何才能找到这个共享对象的确切位置?如果我有一个依赖于这个库的二进制文件,我会使用ldd。LD_LIBRARY_PATH:如何找到共享对象

这就是为什么我问: 我有一个cgi脚本,它使用LD_LIBRARY_PATH设置为说VALUE1时工作。当路径设置为VALUE2时,它不起作用。我想找到如由VALUE1路径指定的库的确切位置(注意VALUE1有近20多个不同的位置)

平台:Linux

回答

9

在一个文件将这个:

#!/bin/bash 
IFS=: 

for p in ${LD_LIBRARY_PATH}; do 
    if [ -e ${p}/libxyz.so ]; then 
     echo ${p} 
    fi 
done 

并运行它。

+0

感谢您的答复。我只是想知道是否有一个现有的Linux工具。另外,我注意到lib文件夹中有一些文件具有其他lib文件夹的路径名 - 所以这也需要递归地查看那些目录 – CuriousDawg 2010-04-07 00:33:30

+0

哦顺便说一句,这不工作没有首先分割使用的路径:分隔符 – CuriousDawg 2010-04-07 00:41:13

+1

@CuriousDawg - 做你完全按照我写的那样来尝试这个例子吗? 'IFS =:'告诉bash要处理:作为分隔符(或bash中的字段分隔符)。 – 2010-04-07 00:44:17

0

睡觉(30);在你的cgi中,从浏览器启动它,然后查看/ proc/$(pidof mycgi)/ maps来获取程序使用的实际库。

3

您也可以使用ldd。要做到这一点,你会:

  1. 将LD_LIBRARY_PATH设置为它工作时的值(即export LD_LIBRARY_PATH=VALUE1
  2. 运行ldd /path/to/prog | grep libxyz.so
+0

是的,我可以做到这一点,但这是一个CGI脚本,并且ldd不能在脚本上工作 – CuriousDawg 2010-04-07 01:11:54

+0

@CuriousDawg - 如果是脚本,则在解释器上运行ldd(即'#!'之后的程序) – 2010-04-07 03:56:43