「CP/M-68K Programmer's Guide」にはoffset については下図のように「(offset宣言で作成した)ストレージ定義はリンカーに渡されません」と言うようなことが書いてあります。
Programmer's Guidでのoffsetに関する記述 |
下図はエラー(File Format error: Invalid symbol flags = 100100)発生の再現実験した時の画面キャプチャーです。
offset 属性シンボルのリンク時のエラー |
マニュアルには説明があるのに実際には使えないというのは実に気になりますね。
下図は上のソースをアセンブルして生成された test.o のダンプ画面のキャプチャです。
test.o のダンプ |
赤丸で囲った部分が offset 属性のシンボルのタイプデータになります。ファイルヘッダの構造は Programmer's Guide に書かれている実行ファイルのものと同様で、シンボルデータの構造は
char name[8];
WORD type;
LONG value;
equ : C000H
data : 8400H
text : 8200H
bss : 8100H
offset: 8040H
再度、「CP/M-68K Programmer's Guide」を確認したところ、シンボルタイプについての記述がありました。
シンボルタイプ |
やはり、offset シンボルタイプの値の 8040H に該当するものはありませんね。
しかし、ここまで解れば、object ファイル内の offset 属性シンボルを equ 属性シンボルに変更すればリンクできそうであるということが推測できます。
試しに 上記の変換機能を有するシンボル変換ツール(convsym)を作って、冒頭で図を貼った test.s のオブジェクトファイルを変換してリンク&実行してみた結果が下記になります。想定外の TRAP が発生することもなく、正常に終了しています。
L>n:convsym test.o te.o |
前回の「Pic24MC68Kマイコン(その9)ehBASICの移植」の記事では offset 属性のシンボルがあるとリンクエラーが発生するので ソース内の offset シンボルを全て equ 宣言に書き換えて対応しましたが、元の offset 宣言のソースから作成したオブジェクトファイルを今回作成した convsym ツールで変換後にリンクすることで ehBASIC も問題無く動作しました。^^
equ 宣言ではソースのメンテ性が悪くなるので、ehBASIC のアセンブラソースも offset 宣言に戻しました。
変換時の画面キャプチャが下図になります。変換された offset 属性のシンボル名が値と共に表示されます。
convsym での変換状況 |
使用する人は居ないとは思いますが今回作成したシンボル変換ツールも前回記事の末尾で公開しました。
[TOP] [ 前へ ] 連載記事 [ 次へ ]

