2010-04-07 69 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