SYSROFフォーマットの解析

はじめに

 秋月電子のマイコンボード・AKI-H8/3664Fには、開発セットとして、日立製のCコンパイラ評価版が提供されています。このコンパイラ、小さくても最低限必要な機能などは一通りそろっているため、大変使いやすいのですが、コンパイル結果が一般的なモトローラフォーマットではなく、SYSROFと呼ばれるJapanese Localなフォーマットで出力されます。
 デバッガを作る上で、プログラムのダウンロードをするためにはこのSYSROFフォーマットを扱えるか、別の既知のフォーマットに変換出来ればよいのですが、あいにく、SYSROFフォーマットの資料もほとんど無く、コンバータも存在しないため、解析することにしました。目標は、①SYSROFフォーマットから、メモリに配置すべきプログラムコード&データを取り出す、②デバッグの為のシンボル情報を取り出す、の2点です。但し、ここでいうSYSROFフォーマットとは、秋月電子AKI-H8/3664開発セット付属の日立製Cコンパイラが吐き出す、拡張子ABSのファイルをさします。一般に、日立/ルネサスのツール類はSYSROFフォーマットを扱うことが出来ますが、これらのSYSROFフォーマットと互換性があるか否かは検証していません。

SYSROFフォーマットの構造

 参考文献(※1)によると、SYSROFフォーマットがブロック構造になっていること、ブロックの先頭はブロックのタイプを表すコードであることなどがわかりましたので、この情報を基に、適当なSYSROFフォーマットのファイルを数種類生成し、ダンプリストを眺めます。そうすると、規則性が見えてきました。その規則性から導き出した、SYSROFフォーマットの推定論理構造は以下のようなものです。

タイプ一覧

タイプ 名前 解説
00 HEADER 不明。ヘッダーと思われるが、ほとんど何も入っていない。
03 BUILD 作成日、ファイル名、CPUタイプなどが含まれている模様。
06 UNITINF ユニット情報。ユニットとは、1つのソースファイル(C/ASM)から生成されたコードやデータのことらしい。下の『UNITINFの構造』で示すレコードが1つ格納されている。
08 SECINF セクション情報。直前に出てきたユニットに含まれるセクションの情報。
0C REFSYM 外部参照シンボル。このユニットが参照する外部のシンボルが必要数分、羅列されている。
14 DEFSYM 外部定義シンボル。このユニットが定義・公開しているシンボルが必要数分、羅列されている。
1A SECHEAD セクションヘッダ。続くオブジェクトデータが所属するユニット番号、セクション番号を表す。
1C OBJECT オブジェクトデータ。
7F TRAILER 終了を示すブロック。以下の固定構造。
FF 03 FD

UNITINFの構造

名前 バイト数 解説
形式 1 不明
セクション 2 このユニットが使用するセクションの数。このブロックの後ろにここで示した数だけセクション情報が連続する。
外部参照シンボル数 2 このユニットが参照する外部シンボルの数。
外部定義シンボル数 2 このユニットが定義するグローバルシンボルの数。
ユニット名 name このユニットの名前。ソースコードの拡張子を省いた名前のようだ。可変長。

SECINFの構造

名前 バイト数 解説
00 1 不明
開始アドレス 4 このユニットのこのセクションが配置される先頭アドレス。
セクションサイズ 4 このセクションのサイズ(バイト)
不明1 4 境界調整数? もしかして、"section"の"ALIGN="の数値か?
ほとんどが2。
不明2 3 おそらく、セクション属性。CODE/DATAとか、定数とか、Shareとか。
セクション名 name セクション名そのもの。Cのソースでは、デフォルトで P / C / D / B が生成される。

REFSYMの構造

名前 バイト数 解説
シンボルタイプ 1 不明。ほとんどがC0。
シンボル名 name シンボル名そのもの。

DEFSYMの構造

名前 バイト数 解説
セクション番号 2 おそらく、シンボルの所属セクションを示す。このユニットが持つセクションの、何番目のセクションに属するか。
シンボル種別 1 不明。00か20。多分、00はReadOnly、20はRead/Write
オフセット 4 セクションの先頭からのオフセットアドレス。
シンボル名 name シンボル名そのもの。

SECHEADの構造

名前 バイト数 解説
ユニット番号 2 おそらく、このファイルに含まれるユニットの、何番目のユニットのデータかを示す。
セクション番号 2 おそらく、このユニットの何番目のセクションのデータかを示す。

OBJECTの構造

名前 バイト数 解説
不明 1 開始フラグ、圧縮フラグなどらしい。
開始アドレス 4 このオブジェクトデータを配置する先頭アドレス。
データ長 1 データのバイト数。このブロックでのバイト数。
データ 任意 データ

解析例

以下は、実際に、秋月電子AKI-H8/3664開発セット付属のCコンパイラでビルドしたABSファイルをダンプした結果です。最初のブロックがタイプ00・HEADER、サイズが33バイト、チェックサムが0x5Eであることがわかります。

解析プログラム

SYSROFフォーマットの解析をするプログラムを作成しましたので、公開します。ソースも公開しますので、ご利用下さい。他のプログラムと同様、BSDライセンスとします。一応、お約束の免責事項です。このソフトウェアは無保証です。このソフトウェアを利用したことによって生じたいかなる損害に対しても、私は責任を負いません。

このプログラムは、SYSROFフォーマットのファイルを解析し、結果を表示します。また、モトローラのSフォーマットのHEXファイルへの変換機能もあります。第1引数が解析するSYSROFフォーマットのファイル(拡張子ABS)、第2引数がモトローラSフォーマットに変換した結果を格納するファイル名、第3引数に-aを指定すると、解析を実行します。詳細はソースコードをご覧下さい。
実行ファイル(sysrof2s.exe)、ソースコード(sysrof2s.c)

参考文献

SYSROFフォーマットについては国内・海外ともほとんど文献が無く、唯一、今回の解析とSフォーマットコンバータの作成に役立ったのが以下の文献でした。
マイクロプロセッサ向き標準OM/LM形式SYSROFの標準化動向
top