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

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

我试图让 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)

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

答案1

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

假设您使用的是 Linux:

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

patchelf --print-needed mysharedobject.so

# outputs:
../libsomething1.so
libsomething2.so.1

替换所需库的路径:

patchelf --replace-needed ../libsomething1.so /foo/bar/libsomething1.so mysharedobject.so

测试新路径:

patchelf --print-needed mysharedobject.so

# outputs:
/foo/bar/libsomething1.so 
libsomething2.so.1

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

答案2

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

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

$ env LD_LIBRARY_PATH="$HOME/local/lib:/opt/other/lib" ./myprog

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

相关内容