第22章
リンク・ファイル
リンク・ファイル(link file)は、TANRENのコマンド・ラインの言葉、つまりオブジェクト・ファイルの名前とオプションを書いたテキスト・ファイルです。tanren @progはファイルPROG.LNKを読み、その言葉を@progの位置に入力したものとして扱います。リンク・ファイルには127文字の制限がなく(21.5節)、プログラムのモジュールの一覧をコメント付きで1か所にまとめておけるので、どのリンクでも同じ一覧が使われます。
22.1 最初のリンク・ファイル
次のリンク・ファイルは、21章のプログラムをリンクします。
; PROG.LNK - the two modules of the example program. main ; the start of the program: it must come first sub ; greet /o:prog.com ; the output file
このファイルは、2つのオブジェクト・ファイルMAIN.TROとSUB.TRO、そして出力ファイルPROG.COMを指定しています。コマンド・ラインには、リンク・ファイルだけを書きます。
A:\>tanren @prog Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools 2 modules, 16 records, ends at EOF. Wrote PROG.COM, 0100-0125 (38 bytes), entry 0100. A:\>prog Hello from TANREN.
22.2 リンク・ファイルの書き方
リンク・ファイルはテキスト・ファイルで、どのエディターでも書けます。中身はコマンド・ラインと同じ言葉で、次の規則に従います。
- 言葉は、空白、タブ、行の終わりで区切ります。1行に言葉を1つ書いても、いくつ書いても、1つも書かなくてもかまいません。main sub /o:one.comを1行に書いたONELINE.LNKは、出力ファイルの名前のほかはPROG.LNKと同じ働きをします。
- セミコロンはコメントの始まりで、コメントは行の終わりまで続きます。コメントは1行を占めても、行の言葉のあとに続けてもかまいません。
- 拡張子なしで指定したオブジェクト・ファイルには、コマンド・ラインと同じように.troが付きます。
- オプションもほかの言葉と同じで、ファイルのどこに書いてもかまいません。
- ファイルは最後の文字で、またはCtrl+Zがあればそこで終わります。最後の行は行の終わりで終わっていなくてもかまいません。
@のあとの名前に拡張子がなければ.lnkが付くので、tanren @progとtanren @prog.lnkは同じファイルを読みます。TANRENは、リンク・ファイルを書いたとおりの名前で開きます。名前にパスが含まれていなければ、カレント・ディレクトリにあるものが開かれます。
22.2.1 コマンド・ラインに収まらない大きなプログラム
TATARA自身は19のモジュールからなり、次のリンク・ファイルでリンクされます(最初の数行のコメントは、ここでは省いています)。
tatara.tro ; the driver cmdline.tro srcline.tro fields.tro ; the front dirtab.tro macros.tro expand.tro ; directives and macros cond.tro expr.tro ; conditionals and expressions symtab.tro optab.tro insn.tro ; the tables and the back end emit.tro objout.tro errs.tro msxdos.tro strutil.tro alloc.tro hash.tro ; shared
19のオブジェクト・ファイルの名前だけで、間に空白を1つずつ入れて 198文字になり、コマンド・ラインの127文字を大きく超えます。リンク・ファイルを使えば、TATARA.COMを作るコマンドは短くなります。
tanren /o:build\tatara.com @tatara.lnk
また、コメントでそれぞれのモジュールのまとまりが何であるかを示せますが、これはコマンド・ラインではできません。
22.3 リンク・ファイルとコマンド・ライン
リンク・ファイルの言葉は@の言葉の位置に入るので、コマンド・ラインでは、それ自身の名前やオプションと混ぜて使えます。TANRENは、入力された言葉もファイルから読んだ言葉も、すべて同じように扱います。
-
モジュールの順序は、いつもと同じように言葉の順序です(21.1節)。SUBONLY.LNKにはsub だけが書いてあります。tanren main @subonlyではMAIN.TROが先に、tanren @subonly mainではSUB.TROが先になります。
A:\>tanren main @subonly ... Wrote MAIN.COM, 0100-0125 (38 bytes), entry 0100. A:\>tanren @subonly main /o:rev.com ... WARNING: REV.COM is entered at 0100, not at 0109. 2 modules, 16 records, ends at EOF. Wrote REV.COM, 0100-0125 (38 bytes), entry 0109.
REV.COMはgreetのコードで始まるので、TANRENはそのことを警告します(21.1節)。
- オプションは、@の言葉の前にもあとにも書けます。tanren /p:4000 @prog /o:high.binは、コードを4000hから始め、HIGH.BINを書き出します。
-
同じオプションを2回指定したときは、最後のものが有効になります。PROG.LNKには/o:prog.comがあるので、@progのあとの/O:はそれを置き換え、前の/O:はそれに置き換えられます。
A:\>tanren @prog /o:other.com ... Wrote OTHER.COM, 0100-0125 (38 bytes), entry 0100. A:\>tanren /o:first.com @prog ... Wrote PROG.COM, 0100-0125 (38 bytes), entry 0100.
- 1つのコマンド・ラインに指定できるリンク・ファイルは1つ だけです。また、リンク・ファイルの中で別のリンク・ファイルを指定することはできません。
TANRENは、リンク・ファイルが指定するオブジェクト・ファイルを、まずそのリンク・ファイルと同じディレクトリで探します。TANRENが探す場所は23章で説明します。
22.4 メッセージ
リンク・ファイルについてのメッセージを表22.1に示します。TANRENはリンクを始める前にリンク・ファイルを読むので、これらのメッセージはバナーの前に表示されます。メッセージの中では、リンク・ファイルは「file list」と呼ばれています。
メッセージ |
意味 |
ERROR: cannot open the file list NAME.LNK |
その名前のリンク・ファイルがないか、@のあとに名前がありません。 |
ERROR: only one file list may be given. |
コマンド・ラインに2つ以上のリンク・ファイルがあります。 |
ERROR: a file list may not name another one. |
リンク・ファイルの中の言葉が@で始まっています。 |
ERROR: too many words on the command line or in the file list. |
言葉が全部で4096文字を超えているか、128文字より長い言葉があります。 |
たとえばコマンド・ラインとリンク・ファイルで同じモジュールを2回指定すると、リンクの途中で、そのパブリックな名前が2回定義されていることが見つかります(27章)。