・OOo_2.0beta2_LinuxIntel_install_ja.tar.gz
OpenOffice 2.0β2 だそうで試してみようかと思ったらバイナリを RPM 形式 でまとめてある状態.仕方ないので,rpm2targz で tar.gz に変換しようとし たら一つ変換できないのがあった.
% rpm2targz openoffice.org-core06-1.9.125-1.i586.rpm gzip: stdin: unexpected end of file %
調べてみたら rpmoffset コマンドで正しく rpm 固有ヘッダの情報が返ってこない感じ.
% rpmoffset < openoffice.org-core05u-1.9.125-1.i586.rpm 22037 % rpmoffset < openoffice.org-core06-1.9.125-1.i586.rpm % rpmoffset < openoffice.org-core07-1.9.125-1.i586.rpm 5569 %
一方、perl で書かれた rpm2cpio コマンドなら cpio に変換できるみたい.
% rpm2cpio openoffice.org-core06-1.9.125-1.i586.rpm | cpio -t CPIO archive found! opt/openoffice.org1.9.125 opt/openoffice.org1.9.125/presets opt/openoffice.org1.9.125/presets/autotext opt/openoffice.org1.9.125/presets/autotext/mytexts.bau opt/openoffice.org1.9.125/presets/basic opt/openoffice.org1.9.125/presets/basic/Standard opt/openoffice.org1.9.125/presets/basic/Standard/Module1.xba ....
とりあえず foreach i ( *.rpm ) ; rpm2cpio | cpio -i ; end で ./opt/ 以 下にファイルを取り出したら動いたみたいだけど,core06 だけ rpmoffset が 効かないのはちょっと気になるなぁ..
最初vi rpmoffsetで強引に中を見たらegcs-2.91.60 19981201 (egcs-1.1.1 release)という文字列が見つかったので、 gccのバージョンの違いかと思ったのですが、そうするとほとんどちゃんと処理される理由がわかりません。 1999年版と2004年版のrpmoffsetのソースをダウンロードしてコンパイルしたものだとどちらもエラーになりません。
changelogを見るとおそらくそれ以前のソース、たぶん、
Mon Jan 25 21:57:21 CST 1999 slakware/a3/bin.tgz: Increased array size in rpmoffset to fix problems with some larger RPMs.
この修正が入っていないソースをコンパイルしたものだと見当をつけました。 しかし1998年版のソースが見つからなかったので、 objdumpでアセンブラコードを出力してbasebinパッケージのものと新しくコンパイルしたものを見比べてみました。
8048576: 68 00 00 04 00 push $0x40000 804857b: e8 d4 fe ff ff call 8048454 <malloc@plt>
804840f: 68 00 00 20 00 push $0x200000 8048414: e8 cb fe ff ff call 80482e4 <malloc@plt>
上がbasebinパッケージのもの、下が新しくコンパイルしたもののmalloc処理の一部の抜粋です。
アセンブラは全然読めませんが-SオプションでC言語のソースと対比してみました。 新しくコンパイルしたもののソースは、
#define RPMBUFSIZ 2097152 省略 char *buff = malloc(RPMBUFSIZ),*eb,*p;
こうなっていて、アセンブラにある0x200000というのは2M(2097152バイト)なので、RPMBUFSIZと一致します。 そうすると0x40000(256K, 262144バイト)がbasebinパッケージのrpmoffsetのmallocで 確保されるメモリーのサイズということになります。たぶん古いソースはRPMBUFSIZ 262144となっていたのでしょう。
これはrpmoffsetがRPMパッケージの先頭から読み込んで内容を調べるサイズなので、 RPM固有ヘッダ部分が262144バイトを超えるものはエラーになるのだろうと考えられます。 -- hatya 2006-10-21 (土) 23:20:00