単一の端末インスタンスの共有ライブラリ(.soファイル)パスを変更する方法

単一の端末インスタンスの共有ライブラリ(.soファイル)パスを変更する方法

リンカーがテスト用の.soライブラリを見つけるために使用したパスの一部を削除したいと思います。

ライブラリパスを追加する方法を見つけました。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"

たとえば、リンカーにはありませんが、リンカーから選択したパスやLD_LIBRARY_PATHライブラリパスを削除するために使用できる同様の変数がありますか?つまり、/etc/ld.so.conf.d/で指定されたパスを無視する方法は何ですか?/usr/local/lib/usr/libLD_LIBRARY_PATH

その理由は、与えられた実行可能ファイルに対してライブラリの依存関係を再帰的に見つけるプログラムを作成するのに忙しいからです。すべての依存関係を見つけ、その依存関係をローカルディレクトリにコピーし、ローカルで実行されてLD_LIBRARY_PATHを設定し、実行可能ファイルを実行するbashスクリプトを作成して、プログラムの移植性を高めることができるかどうかを確認したかったです。以前に重要なライブラリ検索パスを削除した後、ローカルで実行されているこの実行可能ファイルが機能しているかどうかをテストしたいと思います。

答え1

あなたは興味があるかもしれません削除するライブラリパス(提供されている場合)共有ライブラリには次のパスが含まれています。特徴。リンカがライブラリを作成すると追加されます。

以下を使用して、これらのパスを削除(または変更)できます。chrpath、例えば、

chrpath -d mylibraryfile.so

変数からパス名を削除することもLD_LIBRARY_PATH興味があるかもしれません。文字列置換を実行して変数を再エクスポートするだけです。しかし、この質問はこれとは関係がないようです。オフセットする変数がありませんLD_LIBRARY_PATH

~のためより言及されたライブラリの依存関係は、/etc/ld.so.conf.d/プラットフォームがLinuxに制限されているように聞こえます。を使用して依存関係を一覧表示できますldd。 OSXに加えて、すべてのBSDもサポートされていますldd。この目的で使用するスクリプトの1つは次のとおりです。

#!/bin/sh
# $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $
# Edit the output of ldd for the given parameters, yielding only the
# absolute pathnames.
ldd $* | sed \
        -e 's/([^)]*)//g' \
        -e 's/^.*=>//' \
        -e 's/[         ][      ]*//g' \
        -e '/^$/d'

しかし、(注釈に応じて)ローダーに通知する移植可能なメカニズムはありません。無視する既存のパス。 GNU ldドキュメントは、探しているものの概要と説明の順序を提供します。-rpathオプション。リストの最後の項目は次のとおりです。

  • デフォルトのディレクトリは通常、/libおよび/usr/lib
  • ELF システムのネイティブリンカーの場合、ファイルが/etc/ld.so.conf存在する場合にファイルで見つかったディレクトリのリストです。

追加読書

関連情報