Solaris モジューラデバッガ

シンボルの名前解決

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

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

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

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

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

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

MDB カーネルターゲットでは、オブジェクトが、読み込まれたカーネルモジュールのベース名を指定すると考えられます。たとえば、次のシンボル名を考えてみましょう。

specfs`_init

これは、 specfs カーネルモジュール内の _init シンボルの値を求めるために評価します。

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

プロセスターゲットも上記 4 つの形式を受け入れることができますが、この場合、接頭辞としてオプションのリンクマップ ID (lmid) が付きます。lmid 接頭辞は、LM、リンクマップ ID (16 進数)、および逆引用符の順番で構成されます。たとえば、次のシンボル名を考えてみましょう。

LM0`libc.so.1`_init

これは 、libc.so.1 ライブラリにある _init シンボルの値として評価して、この値がリンクマップ 0 (LM_ID_BASE) 上に読み込まれます。同じライブラリが複数のリンクマップ上に読み込まれている場合、シンボル名の重複を解決するためにリンクマップ指定子が必要になることもあります。リンクマップの詳細については、『リンカーとライブラリ』と dlopen(3C) のマニュアルページを参照してください。リンクマップ識別子を表示するには、showlmid オプションの設定に従ってシンボルを出力します (「コマンド行オプションの概要」を参照)。

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