如何更改ldd显示的共享库路径?

Ank*_*lok 7 libraries dynamic-linking postgresql shared-library

我试图让 postgis 扩展在我的系统上工作,它总是吐出“$libdir/postgis2.2”没有这样的文件或目录错误。出于好奇,我执行了“ldd postgis-2.2.so”,结果如下:

    linux-vdso.so.1 =>  (0x00007ffff3bc8000)
    /usr/lib64/libjemalloc.so.1 (0x00002b3fe5ff4000)
    libgeos_c.so.1 => not found
    libproj.so.9 => not found
    libjson-c.so.2 => not found
    libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00002b3fe6237000)
    libm.so.6 => /lib64/libm.so.6 (0x00002b3fe659e000)
    libc.so.6 => /lib64/libc.so.6 (0x00002b3fe689c000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b3fe6c41000)
    /lib64/ld-linux-x86-64.so.2 (0x00002b3fe5b2e000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00002b3fe6e5d000)
    libz.so.1 => /lib64/libz.so.1 (0x00002b3fe7061000)
    liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00002b3fe7277000)
Run Code Online (Sandbox Code Playgroud)

对于一堆依赖项,我看到它们的路径不存在。我猜这是因为我不是在构建 postgis,而是在复制所需的 so 和 libs 以使其手动工作。但我确实知道 postgis 所需的那些 so 文件的路径。我应该怎么做才能将依赖项中的“未找到”更改为 postgis 所需的路径?

tre*_*esf 10

许多教程已经部分介绍了这一点,但我觉得许多解决方案都缺少基本示例。

假设您使用的是 Linux:

注意: patchelf许多系统上默认情况下不安装。您可以使用apt install patchelfdnf install patchelfpacman install patchelf您的包管理器提供的任何内容来安装它。

patchelf --print-needed mysharedobject.so

# outputs:
../libsomething1.so
libsomething2.so.1
Run Code Online (Sandbox Code Playgroud)

替换所需库的路径:

patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so
Run Code Online (Sandbox Code Playgroud)

测试新路径:

patchelf --print-needed mysharedobject.so

# outputs:
/foo/bar/libsomething1.so 
libsomething2.so.1
Run Code Online (Sandbox Code Playgroud)

注意:许多教程推荐另一个名为 的工具chrpath,它可以帮助.so设置了属性的文件rpath,但它似乎不适用于缺少 rpath 的库,也无法更改绝对链接位置。


Kus*_*nda 6

ld.so动态链接器在执行时查找要链接的共享库时,将使用PATH-like 环境变量LD_LIBRARY_PATH

您可以设置LD_LIBRARY_PATH:链接器应在其中查找库的目录的-delimited 列表,例如:

$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog
Run Code Online (Sandbox Code Playgroud)

有关ld.so详细信息,请参阅系统手册。