"ldconfig -v"で自分の足を撃つ
http://www.mail-archive.com/freebsd-questions@freebsd.org/msg176744.html
ldconfig -vの謎が解けたのでshooting oneself in the foot with "ldconfig -v"を訳してみました。
結論は、オプションをつけない"ldconfig" は "ldconfig -R"と等価で、"ldconfig -v"はオプションが付いてるから、デフォルトのディレクトリでヒントを探し、見つからないから、空っぽになるということのようです。
- -
やあ、みんな。
私は6.2-p8を走らせていて、今日、"portsclean -L"の出力を整理しようとしてみたんだ。X11R6のエイリアスが/usr/localにあるけど、それは/usr/X11R6と/usr/localに大量の重複したライブラリがあるとレポートしてきた。私はディレクトリと/usr/X11R6のライブラリをレポートしてきたportscleanが使う`ldconfig -elf -r`の問題を追ってみようとした。私はさらに理解しようとldconfig manpageを読んで、これを見つけた:
-v 冗長モードに切り替えます。
私は自分自身に言い聞かせた。"'-v'オプションで起きてることを解決できるかもしれないぞ。詳細を知らずにはいられないな!"
ああ、"-v"オプションが予定通りに動かない。その代わり、共有ライブラリキャッシュをクリアする(参照: http://www.parsed.org/tip/231/)。空の共有ライブラリキャッシュは、ダイナミックリンクされたプログラムが全て失敗することを意味する。これは、修正するためにコンピュータへログインすることを阻止するという素敵な副作用を持っている(私はこれを理解する前にログアウトしてしまった)。
"リブートすれば上手くいくよ"って?確かにboot /etc/rc.d/ldconfigは走り、共有ライブラリキャッシュを作る。
不運にも、コンピュータは私のアパートと1,000マイル離れてる:(
ということで質問:
"-v"オプションが壊れてるか、ドキュメントが時代遅れになってる?
サンクス
-JON
- -
(引用略)
いいえ、'-v'オプションはドキュメントどおりに振舞っていて、壊れていません。
やはり、ldconfig(8)を変数を全く付けずに走らせれば、共有ライブラリキャッシュをクリアするでしょう。(実際は指定されたディレクトリでキャッシュファイルを探し、何もなかったとして置き換えられるでしょう...)
'-v'をつける事は、何が起きたのかを少し冗長にさせることを除いてldconfigを変えることはありません。
ldconfigは設計どおり、ドキュメントどおり、バグのように振る舞い、何もオプションを付けずに単純に走らせることで、マシンを台無しにする設計です。
Erik Trulsson
- -
(引用略)
ldconfig(8)に一致しない;変数をつけずにldconfigを走らせるのは"-R"を意味するから:
-R 以前に設定したディレクトリを再度検索します。以前作成したヒントフ ァイルをオープンし、ヘッダからディレクトリリストを取り出します。 コマンドラインに指定したパス名も処理します。これが、パラメータ無 指定時のデフォルト動作です。
以前に設定したディレクトリリストは完全に実装されていて、以前に設定したディレクトリに触れてなくて、追加のパス名を指定しなかったので、変更が有効になるべきではなかった。
ldconfigは設計どおり、ドキュメントどおり、バグのように振る舞い、何もオプションを付けずに単純に走らせることで、マシンを台無しにする設計です。
"-v"を指定することで、もう"パラメータが与えられていない"ことを満たしてなくて、最終的に、論理的にデフォルトの場所を示してるのですか?
追加の行動が無い(適切にマッチしたアクションがない)と、無条件に共有ライブラリキャッシュのクリアに結び付けられるのか、私が得た結果を得るのかを知ることができました。もしそうなら、その挙動は本当に紛らわしい。私個人としては、冗長スイッチが挙動を変えるべきじゃない。コンソールに大いに貼り出されるべき。
-JON
- -
(引用略)
ldconfig(8)に一致しない; 変数をつけずにldconfigを走らせるのは"-R"を意味するから:-R 以前に設定したディレクトリを再度検索します。以前作成したヒントフ ァイルをオープンし、ヘッダからディレクトリリストを取り出します。 コマンドラインに指定したパス名も処理します。これが、パラメータ無 指定時のデフォルト動作です。
その通り。
以前に設定したディレクトリリストは完全に実装されていて、以前に設定したディレクトリに触れてなくて、追加のパス名を指定しなかったので、変更が有効になるべきではなかった。
ldconfigは設計どおり、ドキュメントどおり、バグのように振る舞い、何もオプションを付けずに単純に走らせることで、マシンを台無しにする設計です。
"-v"を指定することで、もう"パラメータが与えられていない"ことを満たしてなくて、最終的に、論理的にデフォルトの場所を示してるのですか?
実際は私が示したことではありませんが、しかし、ソースコードをチェックした後、あなたが正しくて、まさしくそれが起こりうることが分かりました。
追加の行動が無い(適切にマッチしたアクションがない)と、無条件に共有ライブラリキャッシュクリアに結び付けられるのか、私が得た結果を得るのかを知ることができました。もしそうなら、その挙動は本当に紛らわしい。私個人としては、冗長スイッチが挙動を変えるべきじゃない。コンソールに大いに貼り出されるべき。
まさに。
Erik Trulsson
- -
以前に設定したディレクトリリストは完全に実装されていて、以前に設定したディレクトリに触れてなくて、追加のパス名を指定しなかったので、変更が有効になるべきではなかった。
...
"-v"を指定することで、もう"パラメータが与えられていない"ことを満たしてなくて、最終的に、論理的にデフォルトの場所を示してるのですか?実際は私が示したことではありませんが、しかし、ソースコードをチェックした後、あなたが正しくて、まさしくそれが起こりうることが分かりました。
... 私個人としては、冗長スイッチが挙動を変えるべきじゃない。コンソールに大いに貼り出されるべき。
まさに。
今の挙動は、せいぜいLOLA違反ぐらいが良さそうに思えます。よろしければ、PRを送ることを考えてもらえませんか。