
環境変数を使用して指定したディレクトリのサブディレクトリからライブラリファイルを検索するプログラムがあります。追加される最初のサブディレクトリを無視して、指定したディレクトリにパスを置くことはできますか?それは私の意味です。
マイフォルダ構造
/usr/lib64/[All the library files]
見ることができるプログラム
$MAGICK_HOME/lib/[All the library files]
どこで操作できますか$MAGICK_HOME
?
だから私がMAGICK_HOME=/usr
ビューに設定すると/usr/lib/[library files]
間違っています。設定すると、どちらが間違っているかをMAGICK_HOME=/usr/lib64
確認できます。/usr/lib/lib64/[library files]
その逆の場合は、接尾../
辞を a で始めて、接頭辞パスで指定された最後のディレクトリを無視して、最も外側のディレクトリから戻すことができます。MAGICK_HOME
正しいディレクトリを指定するには何を入力する必要がありますか?
答え1
以下は3つの興味深い状況です。
アプリケーションが読んでいるライブラリ/usr/lib64
と読みたいライブラリは次のとおりです$MAGICK_HOME/lib
。
アプリケーションをコンパイルするRPATH
場合、RUNPATH
バイナリが$ORIGIN/../lib64
。ライブラリが追加されました$MAGICK_HOME/lib
$LD_LIBRARY_PATH
ldconfig
/etc/ld.so.cache
$MAGICK_HOME/lib
あなたのアプリケーションは代わりにライブラリから読んでいます。/usr/lib64
ld.soが動的にリンクされている場合は、次を検索します。
DT_RPATH
DT_RUNPATH
存在しない場合はELFバイナリでコンパイルされたフィールドです。これは通常絶対パスまたはバイナリ位置()への相対パスです$ORIGIN
。このような環境変数が$MAGICK_HOME
影響を与えるとは思いません。$LD_LIBRARY_PATH
環境変数(安全実行モードで実行されない場合)DT_RUNPATH
ELFバイナリでコンパイルされたフィールド(上記と同様DT_RPATH
)/etc/ld.so.cache
には、候補共有オブジェクトのコンパイル済みリストが含まれています。/lib
そしてデフォルトパス/usr/lib
。一部のアーキテクチャでは、64ビット共有オブジェクトのデフォルトパス/lib64
はとです/usr/lib64
。リンカオプションでバイナリがリンク-z nodeflib
されている場合は、この手順をスキップしてください。
/usr/lib64
おそらくデフォルトのパスにあるので、プログラムは起動時にこれを行うか、インストール$LD_LIBRARY_PATH
中にldconfig
ライブラリを追加するために使用されると思われます/etc/ld.so.cache
。これにより、$MAGICK_HOME/lib
ライブラリが最初に検索されます。これを防ぐことができる場合は、に戻る必要があります/usr/lib64
。
これを使用して特定かコンパイルされたかをreadelf
確認できますが、環境変数が接続に影響を与えるように聞こえますが、これらのオプション(AFAIK)は環境の影響を受けないため、そうではありません。DT_RPATH
DT_RUNPATH
インストールされているライブラリが見つからないため、アプリケーションを起動できません。/usr/lib64
無効なバイナリをロードするのではなく、バイナリをロードしないことが問題である場合は、デフォルトのパスに/usr/lib64
ない可能性があります。この状況で追加のサポートを提供するには、展開とアーキテクチャを知る必要があります。