実行可能ファイルが共有ライブラリを見つけることを許可する方法を探していますが、同じ共有ライブラリの異なるバージョンを使用できるパッケージとの競合を避けるために、これらのライブラリを「プライベートパス」の代わりに保持することをお勧めします。 /usr/lib)。
可能な方法は次のとおりです。
- 実行可能ファイルにrpathを含める
- 実行ファイルの起動時にLD_LIBRARY_PATHを設定します。
- ld.so.conf.d ファイルの ldconfig 構成にライブラリー・パスを追加します。
rpath はターゲット構造をビルドに接続し、ld.so.conf.d はシステムパスを構成し、LD_LIBRARY_PATH は呼び出し側プロセスがそれを知る必要があります。
その場合は、実行可能ファイルにのみ適用されるld.so.conf.d(または同様のローダー構成)を使用できるかどうか疑問に思います。
ベストアンサー1
簡単なことではありません。ld.so.conf
ファイル形式は非常に簡単です。ただパスのリストです。
さまざまな方法で実行可能ファイルを構築すると、いくつかのことができます。通訳;一般的な値は/lib64/ld-linux-x86-64.so.2
1に等しく、実際に動的接続を実行します。したがって、カスタムダイナミックリンカーは異なるように見えたり、ld.so.conf
何でもすることができます。しかし、これはrpathよりはるかに悪いようです!
より簡単な解決策はラッパーです。バイナリをでインストールするprogram.real
か、他の場所にインストールする方が良いです/usr/local/lib/
(例ではありません$PATH
)。次に、単純なシェルスクリプトを入力します/usr/local/bin/program
。
#!/bin/sh
export LD_LIBRARY_PATH=/path/to/libs
exec /usr/local/lib/program/program.real
ライブラリの場所はビルドとは関係ありませんが、呼び出し側はこれについて知る必要はありません。
1:システムで一般的に見つかる項目を見つけるためのクイック方法:readelf /bin/bash -p .interp
。いくつかの異なる実行可能ファイルを試してみると、少なくとも32ビットプログラムと64ビットプログラムが異なるプログラムを使用していることがわかります。