第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節)、それ以外はバナーのあとに表示されます。
/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.
- not a Tatara object file. ファイルが、オブジェクト・ファイルのようには始まっていません。BAD.TROは、まちがって.troの拡張子を付けたソース・ファイルです。
- the object file ends inside a record. ファイルが、内容の途中で終わっています。TRUNC.TROは正しいオブジェクト・ファイルの最初の 30バイトで、ディスクがいっぱいになったり、コピーが途中で止まったりしたファイルと同じ状態です。
- this object file was made by another version. このファイルは、TATARAのオブジェクト・ファイルですが、このTANRENが読めない形式です。TANRENの各バージョンは、同時にリリースされたTATARAのオブジェクト・ファイルを読みます。
どの場合も、このバージョンの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. |
出力ファイルの書き込みに失敗しました。その一部がディスクに残っています。 |