diary/Kojima

・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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41