libtermcap-2.0.8-15.ppc.rpmまた、以下のツール群のアップデート
libtermcap-devel-2.0.8-15.ppc.rpm
pam-0.68-2.ppc.rpm
tar-1.13.11-1a.ppc.rpmを行った。対応する SRPM は
which-2.9-1a.ppc.rpm
patch-2.5.4-8a.ppc.rpm
make-3.78.1-1a.ppc.rpm
bzip2-0.9.5d-1a.ppc.rpm
libtool-1.3.3-1a.noarch.rpm
tar-1.13.11-1a.src.rpmである。テストのあるものについては、一応全てのテストにパスしたが、使う場合はいつものように自己責任で。
which-2.9-1a.src.rpm
patch-2.5.4-8a.src.rpm
make-3.78.1-1a.src.rpm
bzip2-0.9.5d-1a.src.rpm
libtool-1.3.3-1a.src.rpm
glibc-2.1.2-7b.ppc.rpmを "rpm -Uvh" で放り込む。結果は、少なくとも libm の問題については解決している。大変めでたい。また、JAVA も green_thread では動いている。
glibc-devel-2.1.2-7b.ppc.rpm
glibc-profile-2.1.2-7b.ppc.rpm
ついでに libg2c の問題について、同じ所にある新しい開発環境(binutils-2.9.5.0.6-0a、gcc*-2.95.1-0a)を試してみた。結果は敗退。-fPIC はたっていない。しかたなく、ftp://devel.linuxppc.org/users/fsirl/R5/SRPMS/ より gcc-2.95.1-0a.src.rpm をとりよせ、例によって -fPIC をつけるパッチ を使い、RPM を作りなおす。使った SPEC はこれ。出来た RPM は
cpp-2.95.1-0am.ppc.rpmで、対応する SRPM は
gcc-2.95.1-0am.ppc.rpm
gcc-c++-2.95.1-0am.ppc.rpm
gcc-g77-2.95.1-0am.ppc.rpm
gcc-objc-2.95.1-0am.ppc.rpm
libstdc++-2.10.0-0am.ppc.rpm
gcc-2.95.1-0am.src.rpmである。導入には、事前に
binutils-2.9.5.0.6-0a.ppc.rpmを入れておくこと。
makedepend が gcc 関連のヘッダーが見つからないと文句を言うので、
# (cd /usr/lib/gcc-lib/ppc-redhat-linux; ln -s 2.95.1 egcs-2.91.66)とリンクを張る(正しくは、XFree86 を作りなおすべきだが面倒)。
また、-D__linux はデフォールトでなくなった。-D__linux__ を使うこと。これは、気づかずにいると意図しないコードを使ってしまうので危険である。私は、面倒なので
# vi /usr/lib/gcc-lib/ppc-redhat-linux/2.95.1/specとしてしのいでいるが、あまり推奨できない。
....
*cpp_os_linux:
..... -D__linux ....
その他、g++ を使っていて、-O0
でないと正常なコードが出来ない例があったので、最適化レベルを変えて結果チェックをすべき。Netscape-4.7
なども新しい libstdc++ で今の所問題なく動いているが、使う場合はいつものように自己責任で。
[3] 解析プログラムの開発の現状
以前報告した ROOT
を使った部分でのメモリーリークの問題(Heap オブジェクトが IsOnHeap() メソッドで
kTRUE を返さない場合があることに依る)は、ROOT のカスタム new/delete 関連の問題であることが判明した。以下の例を実行すると、どちらも同じ
new で作られたヒープオブジェクトであるのにも関わらず、
LVector:...... is NOT on heap.となる。
TVector:...... is on heap.
---<example starts here>-------
#include "TROOT.h"
#include "TVector.h"
#include <iostream.h>
class LVector : public TVector {
public:
LVector() : TVector(4) {}
LVector(const TVector & q) : TVector(q) {}
~LVector() {}
};
class Track : public TObject {
public:
Track(Double_t e = 0., Double_t px = 0., Double_t
py = 0., Double_t pz = 0.) {
f[0] = e; f[1] = px; f[2] = py; f[3] = pz;
}
~Track() {};
TVector GetPV() {
TVector a(4);
for (Int_t i = 0; i < 4; i++) a(i) = f[i];
return a;
}
private:
Float_t f[4];
};
//_____________________________________________________________________
TROOT UserAnalysisTest("UserAnalysis", "Test UserAnalysis classes");
int main ()
{
Track t;
LVector *qp = new LVector(t.GetPV());
if (qp->IsOnHeap()) cerr << "LVector:" <<
(ULong_t)qp << " is on heap." << endl;
else cerr << "LVector:" << (ULong_t)qp
<< " is NOT on heap." << endl;
TVector *tp = new TVector(t.GetPV());
if (tp->IsOnHeap()) cerr << "TVector:" <<
(ULong_t)tp << " is on heap." << endl;
else cerr << "TVector:" << (ULong_t)tp
<< " is NOT on heap." << endl;
return 0;
}
-----<example ends here>------------
ROOT 開発チームに連絡したところ、
thanks for the detailed bug report. I've located and fixed the bug.
In the soon to be released 2.23 this bug is fixed.
The problem only occurs when the ctor is called with as argument a
function (GetPV()) that allocates and de-allocates a heap object.
との回答をえた。2.23 はもうじき出るようである。当面は、
TVector q(t.GetPV());
LVector *qp = new LVector(q);
などとしてしのいでいる。