Tatara

第27章
リンカーのエラーメッセージ

TANRENは、誤りを見つけると、TATARAと同じようにエラーメッセージを1つ表示して止まります(20章)。この章では、TANRENのメッセージの形、止まったときにディスクに何が残るか、そしてこれまでの章で説明していないメッセージ、つまり壊れたオブジェクト・ファイルとセグメントに関するメッセージを説明します。すべてのメッセージとその原因は、付録Dにあります。

27.1 メッセージの形

TANRENのメッセージは、ERROR:で始まる1行です。TANRENには指し示すソースの行がないので、メッセージに行番号はありません。誤りが1つのオブジェクト・ファイルにあるときは、TATARAのメッセージがソースの名前で始まるのと同じように、メッセージはそのファイルの名前で、大文字で始まります。

A:\>tanren main bad 
... 
BAD.TRO: ERROR: not a Tatara object file.
 

ほかのメッセージは、ERROR: cannot open MAIN,SUB.TRO (21章)のように本文の中でファイルの名前を示すか、ERROR: /D: would put the data on top of the code. (24章)のように、誤りがどのファイルのものでもないので名前を示しません。定義されていない名前の一覧のように、エラーの前に独自の行を表示するものもあります(25章)。

メッセージがいつ表示されるかも、誤りについて教えてくれます。図27.1に、リンクの段階と、それぞれの段階でTANRENが見つける誤りを示します。コマンド・ラインとリンク・ファイルに関するメッセージはバナーの前に表示され(21.6節)、それ以外はバナーのあとに表示されます。

PIC

図 27.1: リンクの段階と、それぞれの段階でTANRENが見つける誤り。

/Qはバナーと要約行を表示しませんが、エラーメッセージは必ず表示されます。

27.2 TANRENは最初のエラーで止まる

TANRENはメッセージを1つ表示して止まります。誤りを直してもう一度リンクすると、次の誤りがあれば、TANRENはそこに進みます。コマンド・ラインに壊れたオブジェクト・ファイルが2つあっても、表示されるのは最初の1つだけです。

A:\>tanren sub bad trunc /o:x.com 
... 
BAD.TRO: ERROR: not a Tatara object file.
 

例外は、どのモジュールも定義していない名前です。TANRENは止まる前に、それをすべて表示します(25.3節)。

TANRENは、すべてのオブジェクト・ファイルを2回読み終えてから出力ファイルを書き出すので、エラーがあると、ファイルが作られる前に止まります。以前のリンクで作った同じ名前の出力ファイルは、そのまま残ります。次のMAIN.COMはtanren main subが書き出したもので、同じ名前のリンクが失敗しても変わりません。

A:\>dir main.com 
... 
MAIN     COM        38 26-10-01  8:25 
 38 bytes in 1 file   2336K free 
A:\>tanren main bad 
... 
BAD.TRO: ERROR: not a Tatara object file. 
A:\>dir main.com 
... 
MAIN     COM        38 26-10-01  8:25 
 38 bytes in 1 file   2336K free
 

エラーのあとでディスクにある出力ファイルは、コマンド・ラインで指定したプログラムではなく、古いものです。TANRENがエラーなしでリンクするまで、それを実行しないでください。

警告.  ERROR: cannot write the output file - the disk may be full.は、TANRENが出力ファイルを作ったあと、それを書いている途中で表示されます。TANRENはすぐに止まり、それ以上ディスクには触れません。ディスクのエラーのあとで何かをすると、被害を大きくするおそれがあるからです。出力ファイルは、プログラムの一部だけが入った状態でディスクに残ります。そのファイルを削除し、ディスクの空きを作るか別のディスクを使ってから、もう一度リンクしてください。

27.3 壊れたオブジェクト・ファイル

オブジェクト・ファイルは、TATARAのオブジェクト・ファイルであることを示し、その形式のバージョンを示す数バイトで始まります(付録F)。TANRENは、ファイルを開くときにそれを確認し、ファイルのレコードを最後までたどります。次のメッセージは、そのファイルがTATARAの作るものではないことを示します。

A:\>tanren main bad 
... 
BAD.TRO: ERROR: not a Tatara object file. 
A:\>tanren trunc sub /o:x.com 
... 
TRUNC.TRO: ERROR: the object file ends inside a record. 
A:\>tanren oldver sub /o:x.com 
... 
OLDVER.TRO: ERROR: this object file was made by another version.
 

どの場合も、このバージョンのTATARAでモジュールをもう一度アセンブルし、リンクし直してください。

27.3.1 終わりのあとのバイト

オブジェクト・ファイルの最後のレコードは、ファイルの終わりを示します。そのレコードのあとに何かがあると、TANRENはそのファイルの名前を表示して、先に進みます。

A:\>tanren tail sub /o:tail.com 
... 
TAIL.TRO: bytes follow the END record. 
2 modules, 16 records, AND BYTES AFTER THEM. 
Wrote TAIL.COM, 0100-0125 (38 bytes), entry 0100.
 

これはエラーではありません。終わりのあとのバイトは読まれず、出力ファイルは書き出されます。しかし、TATARAはそのようなファイルを作らないので、アセンブルしたあとで何かがファイルを変えたことになります。そのモジュールをもう一度アセンブルしてください。/Qを付けると、どちらの行も表示されません。

27.4 セグメント

複数のモジュールで指定した同じ名前のセグメントは1つのセグメントになるので(24章)、どのモジュールでも同じ種類のセグメントでなければなりません。SEGA.ASはsharedをコード・セグメントに、SEGB.ASはデータ・セグメントにしています。

; SEGA.AS - shared is a code segment here. 
                public  ina 
                cseg    shared 
ina:            nop 
                end
 
; SEGB.AS - and a data segment here. 
                public  inb 
                dseg    shared 
inb:            db      0 
                end
 
A:\>tanren sega segb /o:x.com 
... 
SEGB.TRO: ERROR: segment shared is declared differently.
 

表示されるファイルは、2つ目の、異なる宣言が見つかったファイルです。tanren segb segaではSEGA.TROになります。

27.4.1 1つのモジュールの限度

TANRENは、1つのモジュールについて、セグメントを16個まで、グループを 16個まで扱えます。TATARAはそれより多く受け付けるので、多すぎるモジュールは、リンクするときに初めてわかります。

A:\>tanren seg16 /o:x.com 
... 
SEG16.TRO: ERROR: too many segments or groups in one module.
 

SEG16.ASには、標準のコード・セグメントと15個の名前付きセグメントがあります。どのオブジェクト・ファイルにも、中身がなくても標準のデータ・セグメントがあるので、このモジュールのセグメントは17個になります。したがって、1つのモジュールに置ける名前付きセグメントは、標準のコード・セグメントとデータ・セグメントのほかに14個までです。トランジェント・セグメントのグループ(10.6節)は別に数え、1つのモジュールに16個までです。

もっと多くのセグメントやグループが必要なプログラムは、それを複数のモジュールに分けられます。限度はモジュールごとのもので、プログラム全体のものではありません。

27.5 メッセージ

この章で説明したメッセージを表27.1に示します。ほかのメッセージは21章から26章で説明していて、付録Dにすべての一覧があります。

メッセージ

意味

FILE: ERROR: not a Tatara object file.

ファイルが、オブジェクト・ファイルのようには始まっていません。

FILE: ERROR: the object file ends inside a record.

ファイルが、内容の途中で終わっています。

FILE: ERROR: this object file was made by another version.

ファイルの形式が、このTANRENの読むものではありません。

FILE: ERROR: segment NAME is declared differently.

そのセグメントの種類が、このファイルと前のファイルで違います。

FILE: ERROR: too many segments or groups in one module.

モジュールのセグメントまたはグループが16個を超えています。

FILE: bytes follow the END record.

エラーではありません。ファイルの最後のレコードのあとにバイトがあります。

ERROR: cannot write the output file - the disk may be full.

出力ファイルの書き込みに失敗しました。その一部がディスクに残っています。

表 27.1: この章で説明したメッセージ。