2017-04-25 86 views
1

我試着用patchelf改變python的RPATH指向本地安裝的新更新庫。但python仍然無法找到新的庫。爲python設置RPATH不起作用

相反,如果我設置了LD_LIBRARY_PATH環境變量,那麼Python工作正常。

我做了以下 patchelf --set-rpath /home/user/new_lblas/ /home/user/.local/python

其中new_lblas點更新包,比如Intel的LAPACK,BLAS等等

如果我現在做的,python -c 'import numpy',它抱怨libblas.so.3gf沒有找到。 但是,如果我設置環境變量LD_LIBRARY_PATH=/home/user/new_lblas,然後import numpy在Python中工作正常。

有人能幫我們弄清楚我在做什麼錯誤嗎?

readelf -d /home/user/.local/python做patchelf後的輸出如下

 Dynamic section at offset 0x270 contains 26 entries: 
    Tag  Type       Name/Value 
    0x000000000000001d (RUNPATH)   Library runpath: [/home/user/new_lblas] 
    0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
    0x0000000000000001 (NEEDED)    Shared library: [libdl.so.2] 
    0x0000000000000001 (NEEDED)    Shared library: [libutil.so.1] 
    0x0000000000000001 (NEEDED)    Shared library: [librt.so.1] 
    0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
    0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
    0x000000000000000c (INIT)    0x41b700 
    0x000000000000000d (FINI)    0x569238 
    0x000000006ffffef5 (GNU_HASH)   0x4146b0 
    0x0000000000000005 (STRTAB)    0x3ff460 
    0x0000000000000006 (SYMTAB)    0x4085c0 
    0x000000000000000a (STRSZ)    37214 (bytes) 
    0x000000000000000b (SYMENT)    24 (bytes) 
    0x0000000000000015 (DEBUG)    0x0 
    0x0000000000000003 (PLTGOT)    0x7f9fe8 
    0x0000000000000002 (PLTRELSZ)   8040 (bytes) 

給出做patchelf之前,ELF頭看起來如下所示

Dynamic section at offset 0x1f9e00 contains 25 entries:           
     Tag  Type       Name/Value            
    0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0]       
    0x0000000000000001 (NEEDED)    Shared library: [libdl.so.2]        
    0x0000000000000001 (NEEDED)    Shared library: [libutil.so.1]       
    0x0000000000000001 (NEEDED)    Shared library: [librt.so.1]        
    0x0000000000000001 (NEEDED)    Shared library: [libm.so.6]        
    0x0000000000000001 (NEEDED)    Shared library: [libc.so.6]        
    0x000000000000000c (INIT)    0x41b700             
    0x000000000000000d (FINI)    0x569238             
    0x000000006ffffef5 (GNU_HASH)   0x400298             
    0x0000000000000005 (STRTAB)    0x40f6a8             
    0x0000000000000006 (SYMTAB)    0x4035b8             
    0x000000000000000a (STRSZ)    36637 (bytes)            
    0x000000000000000b (SYMENT)    24 (bytes)            
    0x0000000000000015 (DEBUG)    0x0              
    0x0000000000000003 (PLTGOT)    0x7f9fe8             
    0x0000000000000002 (PLTRELSZ)   8040 (bytes)            
    0x0000000000000014 (PLTREL)    RELA              
+0

請格式化你的問題所以它的可讀性。 –

+0

@EmployedRussian對不起,格式不正確。現在希望它更好 – vicky

+0

你的問題仍然缺乏所有相關的細節。在你運行'patchelf'之前還是之後'readelf -d'? '$ newpath'的價值是什麼?你怎麼知道它不工作? –

回答

1

至少有3種方式來設置動態連接器搜索路徑:

  1. export LD_LIBRARY_PATH=/home/user/new_lblas
  2. 重寫二進制設置DT_RPATH動態代碼與值/home/user/new_lblas
  3. 重寫二進制設置DT_RUNPATH動態代碼與值/home/user/new_lblas

上面的#1和#2是等價的,但#3(這是你在做什麼)不是。所不同的是微妙:RPATH影響二進制所有共享庫,但RUNPATH影響二進制,並且遞歸適用於這個二進制負載共享庫。

這解釋了爲什麼LD_LIBRARY_PATH有效,但RUNPATH沒有。

看着patchelf man page,看來你想要的:

--force-rpath 
      Forces the use of the obsolete DT_RPATH in the file instead of 
      DT_RUNPATH. By default DT_RPATH is converted to DT_RUNPATH. 
+0

沒有做任何事情。但是,如果我使用--add-needed,那麼它開始工作 – vicky