ああ……どうして原稿を書いてると Ruby のバグに当たるんだろう。
こないだの pack("N") の話の続きなんですけどね。 pack は確認したけど unpack を確認してなかった自分のバカさ加減を呪いたい。
aamine@asv800 % ./ruby -ve 'p "\000\000\000\001".unpack("N")' ruby 1.9.0 (2004-01-01) [alpha-netbsd] [4294967296]
なぜか今回はあっさりバグの原因にたどりついた。 簡単に言うと、 pack はマシンのエンディアンに合わせて処理を変えないといけないが unpack("N") は常にビッグエンディアンでないといけないってことだな。
えーと、テストはどうしようかなあ。 sizeof(long) != 32 じゃないと意味がないから 64 ビット環境だろ。 Alpha は今動いてる NetBSD/Alpha でいいとして、 ビッグエンディアンも欲しいな。 Solaris/SPARC64 を使おう。
gcc -g -m64 main.o dmyext.o libruby-static.a -ldl -lcrypt -lm -o miniruby ld: fatal: dlopen() of support library (libmakestate.so.1) failed with error: ld.so.1: /usr/ccs/bin/sparcv9/ld: fatal: libmakestate.so.1: open failed: No such file or directory collect2: ld returned 1 exit status *** Error code 1 make: Fatal error: Command failed for target `miniruby'
なんでだ……。
えー?
おや?
答え: GNU make を使うのが正解。 Solaris make が妙な環境変数 (SGS_SUPPORT) を設定してしまうようだ。
ああ、2 時間もはまってしまった。 やっとテストできるよ。
### NetBSD/Alpha aamine@asv800 % file ruby ruby: ELF 64-bit LSB executable, Alpha (unofficial), version 1 (SYSV), for NetBSD, dynamically linked (uses shared libs), not stripped aamine@asv800 % ./ruby -v test_pack.rb ruby 1.9.0 (2004-01-01) [alpha-netbsd] Loaded suite test_pack Started ... Finished in 0.035738 seconds. 3 tests, 19 assertions, 0 failures, 0 errors ### Solaris/SPARCv9 aamine@ultra30 % file ruby ruby: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped aamine@ultra30 % ./ruby -v test_pack.rb ruby 1.9.0 (2004-01-01) [sparc-solaris2.9] Loaded suite test_pack Started ... Finished in 0.025441 seconds. 3 tests, 19 assertions, 0 failures, 0 errors ### Linux/i686 ~/c/ruby % file ruby ruby: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked, not stripped ~/c/ruby % ./ruby -v test/ruby/test_pack.rb ruby 1.9.0 (2004-01-01) [i686-linux] Loaded suite test/ruby/test_pack Started ... Finished in 0.001345 seconds. 3 tests, 19 assertions, 0 failures, 0 errors
よしっ!
あーもう dev に投げて寝よ
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.