web-dev-qa-db-ja.com

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

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

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

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

LD_LIBRARY_PATHにない/usr/local/lib/usr/libなどのライブラリパスを削除するために使用できるLD_LIBRARY_PATHに似た変数はありますか?つまり/etc/ld.so.conf.d/で指定されたパスを無視するにはどうすればよいですか?

これは、特定の実行可能ファイルに対して、ライブラリの依存関係を再帰的に見つけるプログラムを作成するのに忙しいためです。すべての依存関係を見つけ、それらの依存関係をローカルディレクトリにコピーし、LD_LIBRARY_PATHをセットアップして実行可能ファイルを実行するためのローカル実行bashスクリプトを作成することで、プログラムをよりポータブルにすることができるかどうかを確認したいと思います。以前に重要なライブラリ検索パスが削除された後、このlocal-run-executableが機能するかどうかをテストしたいと思います。

5
Simon Streicher

共有ライブラリにrpath機能を介した埋め込みパスがある場合、削除ライブラリパスに興味があります。これらは、ライブラリーがリンカーによって作成されたときに追加されます。

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

chrpath -d mylibraryfile.so

LD_LIBRARY_PATH変数からパス名を削除することも可能性のある領域です。文字列の置換と変数の再エクスポートにより、これを行うことができます。しかし、問題はそれに関係していないようです。 LD_LIBRARY_PATHをキャンセルするための変数はありません。

seeingライブラリの依存関係の場合、/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'

しかし(コメントのアドレス指定)、ローダーにignore既存のパスを通知するポータブルなメカニズムはありません。 GNU ldドキュメンテーションは、求められるものの概要、および -rpath オプションの説明における順序を提供します。これらの項目はリストを締めくくります:

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

参考文献

5
Thomas Dickey