-
Librarian
ライブラリアン
ライブラリアンプログラムのLIBRは、いくつかのオブジェクトファイルを集めてライブラリと呼ばれる単体のファイルに結合する機能を持ちます。いくつかのモジュールを結合する目的にもいくつかあります。
- a. リンクするファイルを少なくする
- b. アクセスを高速化する
- c. ディスクスペースを少なくする
ライブラリのコンセプトを有用なものにするために、オブジェクトファイル以外のモジュールをリンカが扱えるようにする必要があります。オブジェクトファイルがリンカに指定された場合、それが最後にリンクされるモジュールになります。
しかしながら既に知られているが、定義されていない一つかそれ以上のシンボルを定義する場合、ライブラリ内のモジュールがただリンカにリンクされるだけです。そのため、ライブラリ内のモジュールが必要な時にだけリンクされます。
リンクするモジュールの選択がリンカの最初のパスで行われ、ライブラリが直線的に?検索されるので、リンクの際に特別な効果がでるよう、ライブラリ内にモジュールを順序付けることが可能です。これについては後ほど述べます。
ライブラリフォーマット
ライブラリ内のモジュールは基本的には連結されているだけですだ、ライブラリの最初にはライブラリ内のモジュールのディレクトリとシンボルが保持されています。このディレクトリがモジュールの合計よりも小さいので、リンカはスピードアップすることが出来ます。 ライブラリをサーチする時に 最初のパスでモジュール全部ではなく、ディレクトリだけを読めば良いのです。
第2のパスでは他のモジュールを探しながら必要なモジュールだけを読み込みます。こうして、リンクの際のディスクI/Oを最小化しています。
ライブラリフォーマットはオブジェクトモジュールに対して連動しておらず、また他のコンパイラシステムでも使用できるような汎用的なアーカイブではありません。このことは、リンク目的で最適化をスピードアップできるという利点があります。
使用方法
LIBRと呼ばれるライブラリアンプログラムとコマンドのフォーマットは以下の通りです。
LIBR k file.lib file.obj ...
これを翻訳すると、LIBRはプログラム名、kはライブラリアンが要求する、(モジュールの置き換え、抽出、削除、そしてモジュールやシンボルの一覧表示といった)機能のキーレターを表し、file.libは操作対象となるライブラリ名、file.objはゼロもしくはそれ以上のファイル名です。
キーレターは以下の通りです。
- r
- モジュールの置き換え
- d
- モジュールの削除
- x
- モジュールの抽出
- m
- モジュール名の一覧表示
- s
- シンボルつきでモジュールの一覧表示
モジュールを置き換え、もしくは抽出する時、引数のfile.objは置き換え、抽出対象となるファイル名です。このような引数が与えられない場合、ライブラリ内の全てのモジュールがそれぞれ置き換え、もしくは削除されます。
ライブラリへのファイルの追加はライブラリアンに対して置き換えを要求することで実行されます。もし、存在しないのであれば、モジュールは追加されるからです。rキーが使われた時にライブラリが存在しなければ、それが作成されます。
キーレターdでは名前を指定されたオブジェクトファイルが削除されます。この時、何もオブジェクトファイル名を指定しなければ、エラーになります。
mとsのキーレターは名前のついたモジュールを一覧表示し、sの場合はその中で定義されたり参照されるシンボルも表示されます(グローバルシンボルのみがライブラリアンで取り扱われます)。
rやxのキーレターでは空白のモジュールリストはライブラリ内の全部を意味します。
例
これらはライブラリアンの使用例です。
LIBR m file.lib
- ライブラリファイルfile.lib内の全てのモジュールを一覧表示します。
LIBR s file.lib a.obj b.obj c.obj
- モジュールa.obj及びb.obj、c.objの中のグローバルシンボルを一覧表示します。
LIBR r file.lib 1.obj 2.obj
- file.libファイル内にあるモジュール1.obj をオブジェクトファイル1.objの内容で置き換え、2.objも同様に処理します。
LIBR x file.lib
- file.lib内の全部のモジュールを削除することなく抽出し、それらをオブジェクトファイルとして、ディスクに書き出します。
LIBR d file.lib a.obj b.obj 2.obj
- ライブラリファイルfile.libから、a.obj及びb.obj 、2.objを削除します。
引数の供給
LIBRにはしばしば多くのオブジェクトファイル引数を与えなければいけないことがありますが、CP/MやMS-DOSはコマンドラインが127文字に制限されています。LIBRはコマンドライン引数が与えられない場合、標準入力からのコマンド入力を受け付けます。
標準入力がコンソールに接続されている場合、LIBRはコマンドプロンプトを表示します。バックスラッシュを行末で、継続を表す文字として使うことにより、複数行の入力がかのうです。標準入力がファイルからリダイレクトされた場合、LIBRはプロンプトを使うことなく、ファイルから入力をします。以下は例です。
LIBR libr> r file.lib 1.obj 2.obj 3.obj \ libr> 4.obj 5.obj 6.obj
これはコマンドライン上で.objファイルがタイプされたのとほぼ同様に処理されます。libr>プロンプトがLIBR自体によって表示され、そのテキスト内容が入力となります。
LIBR <lib.cmd
LIBRはlib.cmrから入力を読み取り、そこにあるコマンドを実行します。これにより、仮想的にLIBRに対して無制限の長さのコマンドを可能にします。
一覧のフォーマット
LIBRに対するモジュール名のリクエストは一行に一つずつ、標準出力に単純に名前の一覧を生成します。キーレターのsはそれぞれのモジュール名の後にシンボルを加えて、同じものを生成します。
DやUの文字を先頭にしたシンボルはそれぞれa.objやb.obj、2.objなどを定義、もしくは参照するということを表します。-Wオプションはこの操作に対する紙の横幅を表します。例えばLIBR -w80 s file.lib はfile.lib内のモジュールの全てをグローバルシンボルつきで、プリンタやディスプレイ用の80カラム用に整形して、一覧表示します。
ライブラリの順序
ライブラリアンはコマンドラインで与えられた順序にモジュールを並べてライブラリを作成します。ライブラリをアップデートする時は、モジュールの順序は保存されます。新しいモジュールは、ライブラリが作成された後に最後に追加されます。
ライブラリ内のモジュールの順序はリンカに特有です。もし、同じライブラリ内の違うモジュールに定義されているシンボルを参照しているモジュールがある場合、シンボルを定義しているモジュールはシンボルを参照しているモジュールの後に来なければいけません。
エラーメッセージ
LIBRはいろいろなエラーメッセージを発行します。その大部分は致命的なエラーを表していますが、いくつかは-wオプションが使われていないために起こっただけの害のないものです。その場合、全ての警告メッセージは抑制できます。