〜2003年5月中旬〜
ruby -ryaml -e0はエラーにならなくなったが、まだ怪しいらしい。
なるほど。それはautoconfのBusyBox対応といえるかも。 autoconfがhead -1じゃなくてsedを使っているのは、 なるべく少ないコマンドで済むようにってことだと思うんだけど。
% busybox |& head -1 BusyBox v0.60.5 (2002.12.08-16:08+0000) multi-call binary % busybox sed 1q sed: invalid command
0.60.5でもまだ対応してないか。
思い出した。
% setfacl -m 'g:SYSTEM:r--' ~/.ssh/authorized_keys
としてたんだ。LocalSystemにだけ読めればいいわけだから。 tarじゃ復元できないな、やっぱ。
なぜかnmakeから起動したCygwinのコマンドが吐くメッセージとかが消えてしまう。 このためにRubyをnmakeするとsedの結果が0バイトになる。困った。 Borland makeも同じだなあ。cygcheckしてみると
% cygcheck -s Cygwin Win95/NT Configuration Diagnostics Current System Time: Mon May 12 01:16:37 2003 Windows 2000 Professional Ver 5.0 Build 2195 Service Pack 3 Path: c:\cygwin\home\watanabe\bin c:\cygwin\usr\local\bin c:\cygwin\bin
とここまで表示したまま止まってしまう。telnetだと問題ない。なぜ?
なぜかログオフすると「設定を保存しています」と表示したまま1分ほど返ってこない。 ぐぐってみると ここが見つかった。Q329170をアンインストールか。 そういえばこの変なイベントも気になってたんだよね。 でも直らない。うーむ。 プリンタなんかないから最初からPrint Spoolerなぞ無効にしてるんだけどなあ。
よくわからないので、straceを取ってみることにする。
% strace -o date.log date
なぜかdateも表示されない。気になってobjdumpしてみる。
% objdump -p =strace.exe | grep 'DLL Name' DLL Name: msvcrt.dll DLL Name: msvcrt.dll DLL Name: ADVAPI32.DLL DLL Name: KERNEL32.dll
ほう。Cygwinとは関係ないのか。だからdateも表示されないわけやね。 nmakeと同じ症状だ。
date.logを見ると/dev/coninだの/dev/conoutだのがある。 そんなのopenしたらconsoleになっちゃうじゃん。これが原因か。 でも対策はわからない。環境変数CYGWINにttyを入れても何の効果もない。
sshとtelnetの違いといえばcygrunsrv経由かどうかなので、 chown watanabe /etc/ssh_host*key /var/emptyして sshd -Dだけで起動して試してみる。うまくいった。 ということはcygrunsrvが原因か?
ついでにinetd経由でsshdを起動させてみる。/etc/inetd.confに
ssh stream tcp nowait root /usr/sbin/sshd sshd -i
を追加。いけた。とりあえずこれでいこう。
最新のmingw-runtime 3.0.1でrubyをmakeしてmake testするとエラーになってしまった。 アナウンスでなんかdefineしろって言ってた気がするので確認すると、
This release among other things adds a _CRTIMP modifier to the import declarations. It's default definition is set to nothing. It will be set to __declspec(dllimport) if you -D__USE_CRTIMP which will provide a slight speed improvement to your process but will cause multiply defined symbols if you provide a local definition of a shared function, for example malloc.
ということらしい。試しに-D__USE_CRTIMPしてみると落ちない。 なんかよくわからんなあ。mingw-runtime 2.4.1に戻すと問題ない。うーむ。 win32/win32.cだけが関係してるようだ。
とりあえずconfigure.inで-D__USE_CRTIMPを追加しておこう。
test.rbのどこで落ちるのか調べてみると、
test_ok(`echo foobar` == "foobar\n")
を実行するところだった。もっと簡単に`ls`でもだめだった。 gdbで見てみるとpipe_exec()がreturnするときなので、 スタックが壊れている可能性が高い。
原因がわかれば-D__USE_CRTIMPじゃない方法で解決できると思うんだけど。
1.6に変更が入った。先月以来だ。 例の件を試すと全然問題ない。 pipe_exec()を比較してみると1.6と.18では違いがない。 ということはここから呼ばれる別の関数でスタックを壊すやつがいるのか?
今月はすでに600通を越えてる。
GCC 3.3が出たので早速会社のLinux BOXで試したが、 なぜかgcc/cp/call.cがエラーになってしまった。
&& !`DECL_CONSTRUCTOR_P (fn));
と`が入ってる。別の場所で展開しなおしてみるとそこは
&& ! DECL_CONSTRUCTOR_P (fn));
だった。うー。 diffを取ってみると違うのはそこだけだったが、ディスクがやばいか?
compareでなにかわかると思うが、時間切れ。
今回はちょっと趣向を変えて、--disable-sharedをつけた。
% CFLAGS=-Os CXXFLAGS=-Os CC=/usr/bin/gcc ../configure \ --enable-languages=c,c++ --with-system-zlib \ --enable-sjlj-exceptions --enable-threads \ --disable-version-specific-runtime-libs --disable-nls \ --without-included-gettext --without-catgets --disable-shared % make bootstrap libstdc++をconfigureしはじめたら^C % vi Makefile TARGET_CONFIGARGSから--disble-sahredを削除 % make bootstrap
と変な手順で。 つまりlibstdc++はenable shared、libgcc_sは作らないという意味。 libstdc++だけに--enable-sharedを渡せればいいんだけど。
また震源は千葉県北東部だ。同じ場所か?
dietlibcをスタティックにリンクしたdistroらしい。 ISOイメージは用意されてないが、それを作る Makefileは用意されてる。
% gcc -V 3.2.2 -v gcc: couldn't run `i586-pc-linux-gnu-gcc-3.2.2': No such file or directory
なんでこんな仕様にしたんだろう? changesを見てもその点については書いてない。
更新。
そのままconfigureしてmakeすると _WinMain@16がundefined errorになるのは相変わらずだが、 ふとsrc/.libsを見るとcygintl-2.dll-defなんてのがあって、 そんなもんを作ろうとしているのかとなんとなく原因がわかってきた。 試しに--disable-nlsしてみたら通った。 もともと--disable-nls派だから、これで問題なしだ。
ぐぐってみると ここにバイナリはあるようだ。
-2になってるけど、何が変わったんだろう?
robjをvolatileにすればいけるはずです。 ここから始まるのスレッドが参考になると思います。
Windows 2000だとmalloc, freeを2回ずつ呼ぶテストプログラムは正常に動きます。 Win98というのがかなりやばいんじゃないかなあ。
heap_chunk_in_mbの設定を試してみるぐらいしか思いつきません。 このあたりの話が役に立つかも。
bcc32でエラーになるのを放っておくのもまずいので、 1.6対応して強制commit。さてwhy君はどういう反応を見せるか?