たかがビルドでハマりにハマる

何台かでソースからビルドした NetBSD の /usr/bin/ld のうち一台だけ動かない。

$ ld
ld:built in linker script:1: ignoring invalid character `20' in expression
ld:built in linker script:1: ignoring invalid character `37777777646' in expression
ld:built in linker script:1: parse error

それぞれバージョン違いで,動かないのは netbsd-4 のツリーをビルドしたもの。netbsd-4 のバグかと思い,別のマシンにもたまたま netbsd-4 のソースが展開してあったのでビルドするとうまく動く。
あれこれやって,生成された eelf_x86_64.c がおかしいところまでは突き止めたが,何故おかしくなるかわからないので,ビルドログを比較してみると,エラーが出ているのを発見。

 #    create  ld/eelf_x86_64.c
unset MACHINE || true;  LIB_PATH=/usr/lib
/bin/sh /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld/genscripts.sh /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld /usr/lib "/usr"  x86_64--netbsd x86_64--netbsd x86_64--netbsd  elf_x86_64 /usr/lib no elf_x86_64 "x86_64--netbsd"
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory

その手前で stringify.sed が作られていない模様。

-#    create  ld/stringify.sed
-rm -f stringify.sed
-ln -s /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld/emultempl/astring.sed stringify.sed

で,結局あれこれいじっていると,/usr/src/gnu/usr.bin/binutils/ld/stringify.sed (シンボリックリンク)があるのを発見。既に存在するので作られないが,実行時に使われる /usr/obj/gnu/usr.bin/binutils/ld/stringify.sed がないというオチ。
結論としてはこんなかんじ。

  1. 何かの拍子に(過去に)ソースツリー内にシンボリックリンクを作ってしまった。(多分自分のミス)
  2. オブジェクトのディレクトリがソースのディレクトリとは別(NetBSD本体のビルドでは常にそうなる)であってもソース側にターゲットが存在してしまっているとオブジェクト側に作られない。(makeの仕様)
  3. ビルド中に使っている binutils/ld/genscripts.sh の中でエラーを起こしてもビルドが止まらない。(?)
  4. 結果として出来上がった eelf_x86_64.c が壊れているにも関わらず,コンパイルが通ってしまう。具体的には char * で内蔵 ldscript を返す関数が,stringify.sed がないせいで何も作られず,return; となってしまっているのにエラーにならない。(?)
  5. 存在しない戻り値(メモリのどこか)を ldscript だと思って読み込むが,当然ぐちゃぐちゃなのでエラー。

まあ発端は自分が悪いんだけど,バグで同じようなことが起きる可能性も考えると,ツール類も -Wall … -Werror つきでコンパイルできると本当はいいんだろうねえ。

IBM System x3105 で NetBSD 4.0 が起動しない件

NetBSD 3.1 は動いてた。
4.0 にしようとしたら,

viaide2: couldn't map sata regs

といわれてwd0, wd1 が見つからずに死亡。
PR #38011 がそれっぽい。
http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=38011
手で viaide.c にパッチ当ててみると wd0, wd1 は見つかったものの,正しく動いてないのか起動時の init が呼ばれるあたりで固まる。
ちなみにチップセットは NVIDIA nForce Professional 2000 MCP らしいんだが,nForce4 でいいんだよねこれ?(少なくともSATA周りは)
とりあえず 3.1 に戻す。
続く (?)

工事とPMTUなんたら問題

休暇をとってネットワーク工事やサーバ設定など。
相手によって通信できたりできなかったりと,どうも調子が悪いと思ったら Path MTU Discovery Black Hole Problem を踏んでた模様。
NetBSD の in-kernel pppoe と ipfilter, ipnat を使っていたので,とりあえず
ipnat.conf

map pppoe0 10.1.0.0/16 -> 0/32 proxy port ftp ftp/tcp mssclamp 1414
map pppoe0 10.1.0.0/16 -> 0/32 portmap tcp/udp 40000:60000 mssclamp 1414

といった感じで mssclamp で回避。
あと,いまいち速度が出ない問題もあるが,こっちは未解決。それでも今までよりは速いのだが…。
(2007-08-31 追記)
NAT経由はこれでよかったが,ゲートウェイ本体と外部の直接の通信が稀にコケることが判明。
sysctl.conf

net.inet.tcp.mss_ifmtu=1

忘れてた…。

NetBSD/macppc 4.99.25 on MacMini

4.0_BETA からアップグレードというか人柱度アップというか。
GENERICで起動すると,起動中に画面真っ黒。シリアルとかないので何が起きているのか不明。
仕方がないので,何度か再起動して目を皿のようにして見ていると,radeonfb という文字列が最後に見えた。そこで,radeonfb を外した kernel を作ってやると無事起動。

#radeonfb*      at pci? function ?      # ATI Radeon. R3xx is problematic

Radeon 9200 って R3xx より前のやつだよね?よく知らんけど。

disklabelの罠

NetBSD/amd64 3.0.1 (でなくても起こるけど) をいじってたときの話。

# disklabel sd1
disklabel: Can't read master boot record 0: Undefined error: 0
disklabel: ioctl DIOCGDINFO: Inappropriate ioctl for device

というエラーが出まくって,あれこれやっても直らない。
まあ元々初期化したいディスクだったので大胆にddで先頭をまっさらにしてfdiskして…というのもうまくいかない。
ふと,sd1 でなくて /dev/rsd1d を指定したら動いたり。
変だなあと思って ktrace で調べると,たまたまそこに sd1 というファイル(ゴミ)があって,それを開いて使おうとしていたらしい。
どうやら,fdisk も disklabel もディスク名を “sd1″ と指定したら,”sd1”, “sd1d”, ”/dev/rsd1″, “/dev/rsd1d” の順に探すようなのだが,マニュアルとかに書いてないよなあ…。

Solaris で pkgsrc/devel/gettext-tools 作れない件

/usr/pkg/bin/libtool が死ぬのが原因。というか Solaris の ksh が悪い?
shells/bash あたりをインストールして,/usr/pkg/bin/libtool の先頭行が #! /bin/ksh とかになってるのを #!/usr/pkg/bin/bash に直してやるとうまくいく。
直接編集はイクナイという向きは /etc/mk.conf に,

CONFIG_SHELL=${LOCALBASE}/bin/bash
WRAPPER_SHELL=${LOCALBASE}/bin/bash

とか書き足して,devel/libtool-base を make update とかしてやるとよい。かもしれない。

Mac mini で NetBSD/macppc

PowerPC の旧型 Mac mini が某電器で叩き売られていたのでつい買ってしまう。
通販サイトの過去の再安値(kakaku.com調べ)より安い。
早速電源をいれると画面が映らないとか。
別のディスプレイつないだりいろいろ調べた結果,付属のDVI-I→VGA変換アダプタが壊れてた。店に交換に行くのも面倒なので手持ちのアダプタで続行。
そんなわけでさくっと NetBSD/macppc (3.0) の ISO CD-R など焼いて入れてみましたが,起動しない。
うーん,sysinstで普通に入れたんじゃダメですか。NetBSDに初心者ふれんどりーなインストーラはいらないと思うけど,supportedとうたってるハードウェアに正しくインストールされないのはどうなのか。
結局手でHFSパーティション切ったりとかいろいろやって起動。
2007-07-24追記: いろいろというのはこんなかんじ
http://est.sblo.jp/article/1127559.html

インストールに関するドキュメントはとても立派なのがあるんだけれど,太古のPowerMacから全部網羅されているせいで私のような新参者にはちょっと読みにくかった。
とりあえず一通り終わって,あとは setenv auto-boot? true にするだけなんだけど,そうするとハマるという事例があるらしい。まあ,OpenFirmware に落として false に戻せばいいんだけど,専用キーボードがないと起動時に落とすというのができないらしい。キーボード(US)は取り寄せ中なので見送り。
そんなこんなでいろいろ微妙だし,内蔵無線LANとか使えないし,MacOSXに戻すかどうか悩ましい。OSXでも目的は達成できるんだけど、某所のネットワークに繋ぐときに「有償のウィルス対策ソフトを入れないと繋いじゃダメ」とか言われるのがアレ。

NetBSD/amd64 MPACPI

これまでのあらすじ:
仕事に自腹PCを使っていたものを置き換えるため,今年度予算の残り使途に安サーバを一台ねじ込んだ。
で,本日モノが届いた。
IBM e-Server xSeries 100 の一番安い奴。
Intel製のAMD64互換CPU(笑)でしかもデュアルコア(まあ,Celeron D 326ですが)つーことで,NetBSD/amd64 とか突っ込んでみる。
Celeronのくせに64bitx2。128bit級(間違い
MPBIOS経由だとCPUを一個しか認識しないようなのでMPACPIでカーネルを作り直したらうまく認識。
メモリもHDも少ないけれど,実験用サーバなのでこんなもんで十分。

“NetBSD/amd64 MPACPI” の続きを読む