为python设置RPATH不起作用

2024-10-03 19:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用patchelf更改python的RPATH,以指向本地安装的新更新库。但是python仍然无法找到新的库。在

相反,如果设置LD_LIBRARY_PATH环境变量,那么python可以正常工作。在

我正在做以下事情 patchelf --set-rpath /home/user/new_lblas/ /home/user/.local/python

其中new_lblas指向更新包,如intel lapack、blas等

如果我现在这样做,python -c 'import numpy',它会抱怨找不到{}。 但是,如果我设置环境变量LD_LIBRARY_PATH=/home/user/new_lblas,那么python中的import numpy工作正常。在

有人能帮我找出我犯了什么错误吗?在

执行patchelf后,readelf -d /home/user/.local/python的输出如下所示

     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头如下所示

^{pr2}$

Tags: pathhomenewbyteslocallibrary环境变量shared
1条回答
网友
1楼 · 发布于 2024-10-03 19:33:21

至少有3种方法可以设置动态链接器搜索路径:

  1. export LD_LIBRARY_PATH=/home/user/new_lblas
  2. 重写二进制文件以使用值/home/user/new_lblas设置DT_RPATH动态标记
  3. 重写二进制文件以使用值DT_RUNPATH设置DT_RUNPATH动态标记。在

上面的#1和#2是等价的,但是#3(这是您正在做的)不是。区别很微妙:RPATH影响二进制文件所有共享库,但是^{只影响二进制文件,不会递归地应用于该二进制文件加载的共享库。在

这就解释了LD_LIBRARY_PATH起作用,而{}却不起作用

查看patchelfman 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.

相关问题 更多 >