サフィックスで始まるパスプレフィックスを削除するために使用されます。

サフィックスで始まるパスプレフィックスを削除するために使用されます。

環境変数を使用して指定したディレクトリのサブディレクトリからライブラリファイルを検索するプログラムがあります。追加される最初のサブディレクトリを無視して、指定したディレクトリにパスを置くことはできますか?それは私の意味です。

マイフォルダ構造

/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_PATHldconfig/etc/ld.so.cache


$MAGICK_HOME/libあなたのアプリケーションは代わりにライブラリから読んでいます。/usr/lib64

ld.soが動的にリンクされている場合は、次を検索します。

  • DT_RPATHDT_RUNPATH存在しない場合はELFバイナリでコンパイルされたフィールドです。これは通常絶対パスまたはバイナリ位置()への相対パスです$ORIGIN。このような環境変数が$MAGICK_HOME影響を与えるとは思いません。
  • $LD_LIBRARY_PATH環境変数(安全実行モードで実行されない場合)
  • DT_RUNPATHELFバイナリでコンパイルされたフィールド(上記と同様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_RPATHDT_RUNPATH


インストールされているライブラリが見つからないため、アプリケーションを起動できません。/usr/lib64

無効なバイナリをロードするのではなく、バイナリをロードしないことが問題である場合は、デフォルトのパスに/usr/lib64ない可能性があります。この状況で追加のサポートを提供するには、展開とアーキテクチャを知る必要があります。

おすすめ記事