3

(注: 以下のバイナリおよびバイナリとライブラリの名前は、悪意のない人を保護するために難読化されています。;-) アプリは NDA に基づいて所有されていますが、動作はそれに依存しない場合があります。)

実行時に次のエラーを出力する Linux バイナリがあります。

バイナリ: 共有ライブラリの読み込み中にエラーが発生しました: libshared.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

libshared.so が LD_LIBRARY_PATH にあるため、それ自体が混乱を招きます。でも、

  • 実行時にライブラリが正しく検出されるldd binary(つまり、ldd の出力がファイルの場所を指している)

  • の実行時にライブラリが正しく検出されるstrace binaryため、プログラムはその使用情報を出力できます。

独自に実行した場合と strace で実行した場合で動作が異なるアプリケーションを見たことがありませんが、他の誰かが以前にこれが起こるのを見たことがあるのではないでしょうか? これを解決する方法はありますか?

ソースを持っていないので、再構築できません。strace の下で本番環境でアプリを実行することは、おそらく非初心者です。OSはRHEL6.2です。

4

1 に答える 1

8

(古い質問ですが、うまくいけば、これは他の誰かを助けるでしょう)

新しい Linux インストールでは、LD_LIBRARY_PATH は、SUID が設定されたプログラムの標準システム ランタイム リンカーによって使用されません。strace、gdb、およびその仲間は動作が異なり、LD_LIBRARY_PATH を使用しているようです。

suid プログラムの場合、すべてのライブラリがシステム ライブラリ キャッシュ内にある必要があります。「不足している」ライブラリが存在するかどうかを(ルートとして)確認します

ldconfig -p | grep <my_library_name>

不足しているものがあれば、必要に応じて /etc/ld.so.conf または ld.so.conf.d/ の新しいファイルに追加し、次を使用して再構築します。

ldconfig -v

もちろん、必要ない場合は SUID ビットを削除します。

于 2014-02-14T11:56:53.780 に答える