lddが表示する共有ライブラリのパスを変更するには?

lddが表示する共有ライブラリのパスを変更するには?

私のシステムでPostgis拡張機能を動作させようとしていますが、常に "$libdir/postgis2.2" no such file or Directory エラーが発生します。好奇心に「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を構築せずに手動で動作するために必要なライブラリとライブラリをコピーしたからだと思います。しかし、私はPostgisに必要なsoファイルのパスを知っています。依存関係で「見つかりません」をPostgisが要求するパスに変更するにはどうすればよいですか?

ベストアンサー1

多くのチュートリアルではすでにこの内容を部分的に扱っていますが、多くのソリューションに基本的な例がありません。

  • Linuxの場合、patchelfこれはLinuxで行うことができます。
  • MacOSには次のプログラムがあります。install_name_tool

Linuxを使用しているとします。

メモ: patchelf多くのシステムにはデフォルトではインストールされません。apt install patchelfまたは、パッケージマネージャが提供するものをdnf install patchelf使用してインストールすることもできます。pacman 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これは、プロパティが設定されたファイルには役立ちますが、rpathrpathを持たないライブラリでは機能しないようですが、絶対リンクの場所を変更することもできません。

おすすめ記事