[[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 が
効かないのはちょっと気になるなぁ..


-上がっていたので見たら、かなり前の日記と気づいたので投稿するのは止めようかと思ったのですが、
せっかくなので、Plamo4.0xで何度か同じ現象に遭遇した時に調べてみたことを書いておきます。
Plamo4.0xのbasebinパッケージとPlamo4.2xのrpmtoolsパッケージに入っている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]] &new{2006-10-21 (土) 23:20:00};

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS