CentOS 6.3。CentOS 5.4、CentOS 5.6 でも発症する。再現性取れなさそうなぐらい奇怪な現象が発生してます。
とりあえずメモ程度。
症状
初期化の時点 (標準入力を読み始める前) で LoadError が発生する。内容は起動するたびに変わる。
$ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- �B (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- ��M (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory --@� (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory --0� (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- �o) (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- � (LoadError) $ /usr/bin/ruby19 /usr/bin/ruby19: No such file or directory -- ▒ (LoadError)
バイナリ的な部分が出てるので inspect させるとこんな感じ。
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \u001A (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \xE8\u000F \u0001 (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \xE8\u007F6\u0002 (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \u001A (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \b \xDC (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- (LoadError)\n" $ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }" "/usr/bin/ruby19: No such file or directory -- \b \xF0 (LoadError)\n"
-e オプションで起動すると LoadError ではなく TypeError になる。(別のバグかもしれない)
$ ruby19 -e '' ruby19: wrong argument type Object (expected Data) (TypeError)
--help は正常に終了する。
$ ruby19 --help Usage: ruby19 [switches] [--] [programfile] [arguments] -0[octal] specify record separator (\0, if no argument) -a autosplit mode with -n or -p (splits $_ into $F) -c check syntax only -Cdirectory cd to directory, before executing your script (snip) -W[level=2] set warning level; 0=silence, 1=medium, 2=verbose -x[directory] strip off text before #!ruby line and perhaps cd to directory --copyright print the copyright --version print the version
バージョン情報
$ ruby19 -v ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux] $ ruby -v ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux] $ gcc -v Using built-in specs. Target: x86_64-redhat-linux コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux スレッドモデル: posix gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
発現するタイミング
不明
- インストールしたての頃は問題なく動作するが、半日から1日経って起動すると発現するようになる。
- インストールしなおせば解消される (リビルドも不要)。が、また半日か経つと発現する。
回避方法
GCC でコンパイルする場合、デフォルトで -O3 になっている CFLAGS を -O2 にすれば回避できる。- 根本的な解決方法が出てます→ CentOS で Ruby が動かないときは prelink が怪しい - Qiita [キータ]
その他
- Shared library を使った場合はどうなるかは不明 (上はどちらも static linked な ruby と ruby19)
- ECC メモリの効果はない模様 (上のログは非 ECC だが、ECC の 5.6 でも発症した)。
- -g まではやる暇がなかった。
- 単純にビルドに失敗している…のかも。
- 2.0.0dev で発現するかも不明
- Momonga Linux での -O3 でビルドしたものについて発症するかどうかを誰か見たとは思うが、僕はその結果を知らないし、自分で試してもない。