2004年11月07日

FreeBSD 6.0-CURRENT 珍騒記。 ld-elf.so.1 がどーしたこーした。

その時、 mass はぱにくった。
どつぼを力業でのりきった記録。自分用のメモ。


メインマシンの FreeBSD を何気なくアップデートした。 2004/11/7 0:00 頃 cvsup ものである。 2004/9/4 以来やね。今回は /usr/src/UPDATING を読み忘れた。
build 後、

# make installkernel KERNCONF=hogehoge
して reboot 、 boot -s で panic しないので一安心。
順調やねぇ、とシングルユーザーモードの /bin/sh で入って mount -a した。 /usr/src で make installworld した。
奇っ怪な Error で止まった。
ls した。
# ls
/libexec/ld-elf.so.1: /lib/libutil.so.4: Undefined symbol "_DefaultRuneLocale"
(たしかこんな感じ)
pwd した。
# pwd
/libexec/ld-elf.so.1: /lib/libutil.so.4: Undefined symbol "_DefaultRuneLocale"
(違ったかも。ものによっては ld-elf.so.1 が直接ぶーたれるものもあった。)

うるさいだまれしね。

うぅ、やべぇ。ここまでやばいのは経験がない。(弱)
で、 Live CD で起動を試みるものの、うちの環境だと 5.3R も 5.2.1R も /boot/loader 以前に、 boot0 の選択画面 すら出ずにレジスタ値のようなものが画面いっぱいに怒涛のごとく流れて手も足も出ない。
  ※ acd0 に Live CD 、 M/B オンボードの SCSI に da0 / cd0 の構成。
    なぜか cd0 が起動デバイスとして認識されず。
4.10R の disc2 なら起動したが、 5.3R の Live CD に入れ替えての Fixit はまともに動かず...

そんな時、 HDD 上に /rescue が存在したことを思い出す。素敵!!!
いろいろやってみると、どうやら /var を mount した時点からおかしいようだ。 /var 以下を退避してしらみ潰ししますか。

# mount /var
  ↑これ以降、 dynamic link な通常コマンド死亡
# /rescue/cp -Rp /var/* /usr/tmp/
# /rescue/umount /var
/usr/tmp に退避したものを ディレクトリ第一層単位で
# /rescue/cp -Rp /usr/tmp/hogehoge /var
とコピー。都度、 ls とか叩いて確認。
すると、 /usr/tmp/run をコピーした直後の ls で問題発生。

で、結局。

# /rescue/rm /var/run/ld-elf.so.hints
だけでよかったみたい。消しても作り直してくれるし。うゆー。

/usr/src/UPDATING の 20040728 あたりの問題なのかなぁ。でもそれは前回アップデートした時に踏んでるはずなんだけど...
恐いので念のため /usr/src/gnu/usr.bin で make install して、 kernel と userland 作り直して。で、めでたしめでたし。

そっかぁ、 /rescue の下ってクランチバイナリなんだっけ。かこいい。
でもアップデートを繰り返してると古いバイナリが i-node 違い size 違いで残っているのはちょっとかこわるい。
アップデートの時に不要な標準バイナリを消す機構ってないのかな? 対話式とかで。


参考リンク:
Program Library HOWTO - 3.2. ライブラリはどのように使われるか げ、 JF だ!
そっすかぁ、 ELF キャッシュってやつっすかぁ。よくわらかんっす。
ld-elf.so.1(1) と ldconfig(8) を読んで勉強しませう。
おれ、よくこんなんで CURRENT なんて使ってるなぁ。惰性なんだけどね。

Posted by mass at 2004年11月07日 22:15 [UNIX] | TrackBack
Comments
Post a comment









Remember personal info?