[H8-ML(413)] 購読希望&OBJファイルとLIBファイルの解析結果
From: "K.Kitagawa" <northriv@xxxxxxxxxxxxxxxxx>
Date: 1999年10月23日(土)14時09分56秒
いまAKI-H8をつかってSmartMediaをつなげようとしてます。このメーリングリストが
有るのを知って早速登録しました。

必要に迫られたので、バイナリエディタをつかって解析してみました。

以下の解析結果は秋月が配布している古いバージョンのH8/300H用アセンブラ、Cコ
ンパイラの出力するOBJファイルで有効。とりあえず、AKI-H8のアドバンスドモード
で使用するためのアドレッシングモードの分しか調べていない。また、間違いや例外
があるかもしれないので、信用しきらないでほしい。
この解析結果の応用としては、AKI-H8用のDOSみたいなものぐらいかな。自由な位置
にプログラムを配置するためには、AKI-H8上にリンカを作る必要がある。この用途に
は、以下の解析結果で十分だと思う。




OBJファイルの構造

block1
block2
block3
...
blockn
0xFF03FD
ここでブロックの構造は次のようになっている
byte blockID
byte sizeofblock
byte data[sizeofblock-3]
byte checksum

sizeofblockがbyteなので、256バイト以上のブロックは分割さる。分割される場
合、最後のブロックをのぞいてblockIDは0x80引いた値になる。
チェックサムを含めてブロック内のすべてのbyteを足したときの最下位byteが0xFFに
なっている。
blockIDは次のようになっている。順番はOBJファイル内のものになっている。分割し
て場合も1つと数えている。

blockID        種類                  数
0x80           file header           1
0x84           program info          1
0x86           object info           1
0x88           section info          sectionの数
0x8C(0x0C)     import table          0or1
0x94(0x14)     export table          0or1
0x9A           section header
0x9C(0x1C)     section data     section header1つにつき1つ
0xA0(0x20)     cross refernce table  section header1つにつき0または1つ

それぞれのブロックのデータ部分の構造は次のようになっている。
section no./import no.は0から数える。ソースファイルでの順番とは異なる。
yymmddhhmmssとあるのは、日時のこと。たとえば、991023082542というようになって
いる。2000年以降はどうするんでしょうね。

file header(0x80)
不明
program info(0x84)
 byte 不明
 char[] yymmddhhmmss
 byte length of program name
 char[] program name PROGRAM=で指定したもの
 byte length of target cpu
 char[] target cpu '300H'
obj info(0x86)
 byte length of obj name
 char[] obj name
 byte length of compiler name
 char[] compiler name 'A_H8S'または'C_H8S'
 char[] yymmddhhmmss
 byte 0x00
section info(0x88)
 byte 0x00:絶対アドレス(locate=で明示された場合)
  0x40:相対アドレス
 dword 開始アドレス、相対アドレスの場合0にされる
 dword セクションのサイズ
 dword 境界調整数(align)
 byte セクションの種類
  0x00:code
  0x10:data
  0x11:common
  0x20:stack
 word 0xFFC0
 byte length of name
 char[] name セクション名
import table(0x0C,0x8C)
次の構造のものが並んでいる
  byte 0xC0
  byte length of name
  char[] name 外部参照名
export table(0x14,0x94)
次の構造のものが並んでいる
  word section no.
  byte 0x00:Cの関数
   0x20:Cの変数、アセンブラのアドレスシンボル
   0x40:定数シンボル
  dword location/value
  byte length of name
  char[] name 外部定義名
section header(0x9A)
 word 0x0000
 word section no.
このあとに、section data、cross refernce table(codeセクションの場合)がつづ
く。
1つのセクションに複数個有る場合がある。
section data(0x1C,0x9C)
 byte 0x80
 dword location
 byte size of data
 byte data[size of data]
cross refernce list(0x20,0xA0)
相対アドレスセクションを参照している場合、または外部参照している場合にコード
内の未決定アドレスをリンカで設定するためのもの。
次の構造のものが並んでいる。
 byte アドレッシングモード
  0x04 プログラムカウンタ相対
  0x05 イミディエト,ディスプレースメント付きレジスタ間接
  0x07 絶対アドレス
 dword コード内の置き換える場所
 byte 0x00
 byte 置き換えるサイズ(bit)
  0x08 8bit
  0x10 16bit
  0x18 24bit
  0x20 32bit
 byte この位置から0xFFまでのバイト数
 (アドレスの計算式)
 byte 0xFF

 アドレスの計算式は次の値と演算子の組み合わせによる。逆ポーランド記法。符号
付き32bitで計算。
 ・値
  byte 種類
   0x00 セクションの先頭アドレス
   0x02 外部参照シンボルのアドレス
   0x03 定数
   0x04 セクション集合のサイズ
   0x05 セクション集合の先頭アドレス
  前のbyteが0x03の場合
   byte 0x04
   signed int32 定数
  それ以外
   word section no.またはimport no.
 ・演算子
  byte 0x20 + 加算
   0x21 - 減算
 例:02 00 12 00 00 03 03 04 00 00 00 90 20 21 00 00 00 04 21
  (import18 - (section3 + 144)) - 4




LIBファイルの構造

0 file header block
0x100 obj table block
0x200 export table block
0x?00 obj1
0x?00 obj2
 ...
0x?00 objn
0x?00 0xFE03FD
ブロックの構造は0BJファイルと同じだが、上の項目の境界は256バイトに整理されて
いる。OBJの内容はOBJファイルそのまま。

それぞれのデータ部分の構造

file header(0xE0)
 0x00
 char[] yymmddhhmmss
 char[] yymmddhhmmss
 後は不明
obj table(0x62,0xE2)
次の構造が並んでいる
 char[] yymmddhhmmss
 word objimage address ファイル内でのポインター÷256
 word size OBJのサイズ÷256
 byte length of name
 char[] name
export table(0x64,0xE4)
次の構造が並んでいる
 word obj no.
 byte length of name
 char[] name

スレッド概略
[表示中](起点)


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]