Solaris モジューラデバッガ

シンボルの名前解決

「構文」で前述したように、式のコンテキスト内のシンボル識別子は、このシンボルの値を求めるために評価します。一般的に、この値は、ターゲットの仮想アドレス空間内のシンボルと関連付けられる、記憶領域の仮想アドレスを表します。ターゲットは複数のシンボルテーブルをサポートできます。そのうちのいくつかを次に示します。

一般的に、ターゲットは、最初に一次実行可能シンボルテーブルを検索し、次にほかの 1 つまたは複数のシンボルテーブルを検索します。ELF シンボルテーブルには、外部シンボル、大域シンボル、静的シンボルなどへのエントリだけが含まれます。自動シンボルは、mdb によって処理されるシンボルテーブルにはありません。

さらに、mdb は、専用のユーザー定義シンボルテーブルを提供し、このシンボルテーブルを他のどのターゲットシンボルテーブルよりも先に検索します。専用シンボルテーブルは、最初は空の状態ですが、::nmadd::nmdel dcmd を使用して操作できます。

::nm -P オプションは、専用のシンボルテーブルの内容を表示するために使用されます。専用のシンボルテーブルによって、元のプログラムでは抜け落ちていたプログラム機能やデータのシンボル定義を作成できます。次からは、MDB がシンボル名をアドレスに変換したり、アドレスを最も近くのシンボルへ変換したりするときにはいつでも、これらの定義が使用可能となります。

ターゲットには複数のシンボルテーブルが含まれていて、各シンボルテーブルには複数のオブジェクトファイルからシンボルを入れることができるので、同じ名前で異なるシンボルが存在することもあります。このような場合に、プログラマが希望するシンボル値を得られるように、MDB はシンボル名適用範囲演算子として、逆引用符 " ` " を使用します。

ユーザーは、object`namefile`nameobject`file`name などのように、シンボル名の解釈に使用する範囲を指定できます。オブジェクトの識別子は、ロードオブジェクトの名前を参照します。ファイル識別子は、ソースファイルのベース名を参照します。ソースファイルは、指定されたオブジェクトのシンボルテーブル内に STT_FILE 型のシンボルを持っています。オブジェクト識別子の解釈は、ターゲットタイプによって決まります。

MDB カーネルターゲットでは、オブジェクトが、読み込まれたカーネルモジュールのベース名を指定すると考えられます。たとえば、シンボル名 specfs`_init は、specfs カーネルモジュール内の _init シンボルの値を求めるために評価します。

mdb プロセスターゲットでは、オブジェクトが、実行可能な名前、または読み込まれた共用ライブラリの名前を指定すると考えられます。この場合、次の形式のどれかが使用されます。

シンボルと 16 進整数値で名前が重複した場合、MDB は、最初にあいまいなトークンをシンボルとして評価し、次に整数値として評価しようとします。たとえば、f というトークンが、デフォルトの 16 進数では 10 進整数の 15 を表し、同時にターゲットのシンボルテーブル内の f という名前の大域変数を表す場合もあります。あいまいな名前を持つシンボルが存在するときには、明示的な 0x または 0X の接頭辞を用いることによって、整数値を明確に指定できます。