1999/06/21     CERNLIB ... continued (Problem Resolved)

[5-2] cernlib のテストがやっと全て通った

現象


これではとても仕事に使えない。cernlib の方を最適化レベルを変えたりして試すがだめ。これらの FORTRAN 関数を C から呼ぶテストプログラムを書いて独立にテストしたところ精度が出ている。一時期、訳が分からない状態に陥ったが、cernlib 提供の FORTRAN 版のテストプログラムでやると問題がでる。これは、"gcc -lg2c" でなく "g77" でコンパイル・リンクすると、g77 がこれらを組み込み関数として持っているため、明示的に external 宣言しないと、cernlib のものでなく libg2c.a のものを優先的にリンクしてしまうのが原因であった。cernlib のオブジェクトモジュールを明示的に書いてもである。
これは、一般的に FORTRAN の仕様であるので、例えばベッセル関数が g77によってサポートされていることを知らないと、意図しない関数を使ってしまうことになり危険である。

libg2c.a の中のこれらの組み込み関数は、実は libm の中にある C の関数のラッパーにすぎない。したがって、疑うべきものとして最後にとっておいた glibc を疑わざるを得なくなった。glibc の srpm を展開して見てみるとglibc-2.0x から 2.1x に移る段階で、問題の

        sysdeps/libm-ieee754/{s_erf.c,e_j0.c,e_j1.c}

を含む一連の関数のソースが更新されている。そこで、これらの関数をデバッグする元気もでてこないので、とりあえず、この3つのファイルをもとに戻してみた。make すると build-ppc-linux/math 以下に libm.so ができるので、このディレクトリーを取り合えず LD_LIBRARY_PATH に指定して、テストを走らせてみると、やっぱりというか、正しく動いてしまった。

それで、glibc の rpm を作りなおすことにした。glibc の置き換えは危険なので、build-ppc-linux ディレクトリーでの "make check" が正常終了することは最低限確かめること。さらに念を入れるなら、"rpm -ivh --root" でどこか別の所にインストールするか、"rpm2cpio foobar | cpio -i -d" で、展開した上で、ライブラリーの居場所をLD_LIBRARY_PATH に指定して、特定の shell の中で、ローカルに新しい libc をテストしてからインストールすべきである。あるいは、別のレスキュー起動ディスクを確保して、うまく動かない場合は、そちらから修復できるようにしておく。

パッチをあてた後、"rpm -ba" で glibc-2.1.1-2cm シリーズ

        glibc-2.1.1-6cm.ppc.rpm
        glibc-devel-2.1.1-6cm.ppc.rpm
        glibc-profile-2.1.1-6cm.ppc.rpm

ができたので、覚悟を決めて "rpm -Uvh" で放り込んだ。結果は、今の所良好。期待どうり cernlib も正常動作する。他のものも大丈夫かしばらく様子を見る。

いずれにせよ、これで、R5 移行のための最低限の条件が満たされた。

この問題は、時間ができ次第、メーリングリスト(入りなおさなくてはならないか)に報告すべきであろう。
 


Back to Keisuke Fujii's MkLinux/LinuxPPC Life