XOUTはCP/M-8000で使われている、実行とリンクが可能なオブジェクトファイルの形式です。
解析しているうちに頭がこんがらがってきたので、ファイル構造をメモ代わりに書いていきます。
参考にした情報は、CP/M-8000 Programmer's Guide (注 PDF)と P-CP/M-Z8k SOURCES (注 ZIP) にあるLD8Kリンカのソースコードです。
説明中の変数名は、リンカのソースコードで使われている名前をそのまま使っています。
ちょっとわかりにくい命名ですが、コードを読むときの助けになるよう、そのままにしておきます。
Z8000はビッグエンディアンなのでデータは最上位バイトから最下位バイトへの並びです。
各データ構造は2 byte境界で揃えられています。
リンク可能なのは0xEE00か0xEE02で、セグメンテッドとノンセグメンテッドはリンクできない。
リンカのソースでは、リンク可能な0xEE06と0xEE0Aも存在していることになっている。
配布されているCP/Mのイメージに含まれるコマンドは、0xEE03か0xEE0Bだけで、
0xEE01, 0xEE07は見当たらない。
0xEE03と0xEE07の違いは不明だが、64k byteの空間に命令コードとデータを収める形式。
マジックが0xEE07のコマンドが無いため、比較ができないので不明。
0xEE0Bは、コードとデータの空間を分離して、64k byteづつの空間をそれぞれに割り当てる。
1セグメントが64k byte の制約を緩和できる。CPUに外付けのMMUがないと実現できない。
x_nseg (2 byte)
セグメントの数
x_init (4 byte)
コード/データのバイト数
x_reloc (4 byte)
再配置情報のバイト数
値が0の場合は、ファイルはリンクされている。
x_symb (4 byte)
シンボルテーブルのバイト数
値が0の場合は、ファイルからシンボルテーブルは取り除かれている。
解析しているうちに頭がこんがらがってきたので、ファイル構造をメモ代わりに書いていきます。
参考にした情報は、CP/M-8000 Programmer's Guide (注 PDF)と P-CP/M-Z8k SOURCES (注 ZIP) にあるLD8Kリンカのソースコードです。
説明中の変数名は、リンカのソースコードで使われている名前をそのまま使っています。
ちょっとわかりにくい命名ですが、コードを読むときの助けになるよう、そのままにしておきます。
Z8000はビッグエンディアンなのでデータは最上位バイトから最下位バイトへの並びです。
各データ構造は2 byte境界で揃えられています。
XOUTフォーマット
a.outフォーマットと似た構造になっており、5つのパートからなっている。- ヘッダ
- セグメント情報
- コード/データ
- 再配置情報
- シンボルテーブル
ヘッダ 16 byte
ここには、セグメントの数や各パートのサイズなどのファイルの全体的な構造が書かれている。
x_magic (2 byte)
ファイルの形式を認識するための番号
0xEE00 セグメンテッド 実行不可
0xEE01 セグメンテッド 実行可能
0xEE02 ノンセグメンテッド 実行不可
0xEE03 ノンセグメンテッド 実行可能 命令コードとデータの空間は非共有
0xEE07 ノンセグメンテッド 実行可能 命令コードとデータの空間は共有
0xEE0B ノンセグメンテッド 実行可能 命令コードとデータの空間を分離
0xEE02 ノンセグメンテッド 実行不可
0xEE03 ノンセグメンテッド 実行可能 命令コードとデータの空間は非共有
0xEE07 ノンセグメンテッド 実行可能 命令コードとデータの空間は共有
0xEE0B ノンセグメンテッド 実行可能 命令コードとデータの空間を分離
リンク可能なのは0xEE00か0xEE02で、セグメンテッドとノンセグメンテッドはリンクできない。
リンカのソースでは、リンク可能な0xEE06と0xEE0Aも存在していることになっている。
配布されているCP/Mのイメージに含まれるコマンドは、0xEE03か0xEE0Bだけで、
0xEE01, 0xEE07は見当たらない。
0xEE03と0xEE07の違いは不明だが、64k byteの空間に命令コードとデータを収める形式。
マジックが0xEE07のコマンドが無いため、比較ができないので不明。
0xEE0Bは、コードとデータの空間を分離して、64k byteづつの空間をそれぞれに割り当てる。
1セグメントが64k byte の制約を緩和できる。CPUに外付けのMMUがないと実現できない。
x_nseg (2 byte)
セグメントの数
x_init (4 byte)
コード/データのバイト数
x_reloc (4 byte)
再配置情報のバイト数
値が0の場合は、ファイルはリンクされている。
x_symb (4 byte)
シンボルテーブルのバイト数
値が0の場合は、ファイルからシンボルテーブルは取り除かれている。
0 件のコメント:
コメントを投稿