[OSASK 5244] Re: obj2bimt

  こんにちは、川合です。


I.Tak. さんは 2002/10/28 18:57:23 の「[OSASK 5233] obj2bimt」で
書きました:

> obj2bim2がcoffに対応していない(win32専用)なのはケシカランと思った
>ので、coffに対応させたバージョンを作ってみました。
>http://user.ecc.u-tokyo.ac.jp/~g240845/osask/
>
> ソースだけですけど、windowsを使っている人たちはcoffなんて使わない
>に違いない……ということで、バイナリなしです。ではー

  先ほどダウンロードして、ソースとドキュメントを読ませていただき
ました。なるほど、どういうことになっているのか、大体分かりました
。ありがとうございます。

  僕としては、「win32のCOFFもどき」よりもピュアなCOFFの相対ラベ
ル記述の方が好きです。そう、僕がもし独自にオブジェクトファイル形
式を設計するとしたら、ピュアなcoffと同じにしたでしょう。あれこそ
正常なセンスというものです(まあ、COFFもどきだと0x00000000という
バイト列が頻繁に出るようになるので、圧縮するときに圧縮率が上がる
というメリットはありますが)。

  で、僕は自動判別型両対応のobj2bim3を開発したいと望んでいるので
すが、どうやって判別すればいいでしょうか?(僕が読んだ限りでは、
obj2bimtはピュアCOFF専用のようだと思ったんですが、そうですよね?
それとも両用になっていますか???・・・いや、両用にはなっている
けど、これは危険じゃないですか?それについては後述)。

  COFFもどき(=win32)では、セクションヘッダのflagsが、
    .text : 0x20 ?? ?? 0x60
    .data : 0x40 ?? ?? 0xc0
    .bss  : 0x80 ?? ?? 0xc0
となっているみたいなんですが、この部分はピュアではどうなっている
でしょうか?この0x20、0x40、0x80という値はピュアでももどきでも共
通のようですが上位の0x60、0xc0というのは差違があるんじゃないかと
思っています。どうでしょうか?

  これに限定せず、もし自動判別に使える情報があったら教えてくださ
い。URLでもいいです。・・・と言いつつ探していたら、関連情報を見
付けました。Googleのキャッシュなので長ったらしいですがすみません
。

http://www.google.co.jp/search?q=cache:_hi14d_nKS8C:giscenter.icc.ru:8082/scripts/WWWBinV.dll/ShowR%3Fcoff.rfi+common+object+file+format&hl=ja&ie=UTF-8&inlang=ja

これによると、マイクロソフトがflagsにつけた意味は次のようになっ
ているようです。

  bit 0 : リザーブ(TYPE_DSECT)
  bit 1 : リザーブ(TYPE_NOLOAD)
  bit 2 : リザーブ(TYPE_GROUP)
  bit 3 : リザーブ(TYPE_NO_PAD)
  bit 4 : リザーブ(TYPE_COPY)
  bit 5 : セクションはコードを含む
  bit 6 : セクションは初期済みデータを含む
  bit 7 : セクションは未初期化のデータを含む
  bit 8 : リザーブ(LNK_OTHER)
  bit 9 : セクションはコメントもしくはその他のデータを含む
  bit10 : リザーブ(TYPE_OVER)
  bit11 : Section contents will not become part of image.
  bit12 : Section contents comdat.
  bit13 : リザーブ
  bit14 : Reset speculative exceptions handling bits in the TLB entries for this section.
  bit15 : Section content can be accessed relative to GP
  bit16 : MEM_SYSHEAP
  bit17 : MEM_PURGEABLE
  bit18 : MEM_LOCKED
  bit19 : MEM_PRELOAD
  bit20-23 : アライン設定(上記ページによると、デフォルトは16バイ
               トアラインだそうです)
  bit24 : セクションは拡張リロケーションを含む
  bit25 : セクションは無効である。
  bit26 : セクションはキャッシュ不能である。
  bit27 : セクションはページング可能ではない。
  bit28 : セクションは共有可能である。
  bit29 : セクションは実行可能である。
  bit30 : セクションはリード可能である。
  bit31 : セクションはライト可能である。

  つまり、COFFもどきである限り、bit29-bit31はそれなりにセットさ
れると仮定して良さそうです。.textならbit29が、.dataや.bssでは、
少なくともリードは許可されるでしょう。

  一方、ピュアなCOFFの仕様は、以下のページで見付けました。

http://osr5doc.ca.caldera.com:1997/topics/COFF_SectHdrFlags.html

  bit 0- 4 : セクションタイプ
    0x00 : レギュラーセクション
    0x01 : ダミーセクション
    0x02 : ノーロードセクション
    0x04 : グループ化されたセクション
    0x08 : パディング用セクション
    0x10 : コピーセクション
    他の値については、おそらくリザーブ
  bit 5 : セクションはコードを含む
  bit 6 : セクションは初期済みデータを含む
  bit 7 : セクションは未初期化のデータを含む

  bit 8-15 : 拡張セクションタイプ(ここが非零の場合はbit0-15全体
               でセクションタイプを示すらしい)
    0x0200 : コメントセクション
    0x0400 : オーバレイセクション
    0x0800 : .libのためのセクション(リンカはこれをコメントセクシ
               ョン扱いせよ)

  そんでもって、上位16bitについては特に規定していないようです。

  ということで、bit29-31が000ならピュアなCOFFで、非零ならCOFFも
どきと解釈することにします。

  それで先に飛ばしたobj2bimtの危険性についてですが、それは

    call external_symbol+10

みたいな場合も

    call external_symbol

のように処理してしまうという意味で危険だと思ったんです。まあ、確
かにそういうケースはめったにないかもしれませんが。

  それと以前に2ちゃんねるでobj2bimがリードオンリーデータを捨てて
しまって困るという書き込みがあったのですが(Part2の512さんです)
、今回やっとリードオンリーがどのように記述されるのか分かったので
obj2bim3でサポートできそうです(というか下位8bitだけでセクション
を判定することにします)。今日中にリリースします。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/


ML番号でジャンプ
ML単語検索