.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)stab.5 8.1 (Berkeley) 6/5/93 .\" %Id: stab.5,v 1.3 1997/03/07 03:28:08 jmg Exp % .\" jpman %Id: stab.5,v 1.3 1998/07/21 23:07:45 jsakai Stab % .\" WORD: symbol table シンボルテーブル .\" WORD: directive ディレクティブ(命令、指令の類) .\" .Dd June 5, 1993 .Dt STAB 5 .Os BSD 4 .Sh 名称 .Nm stab .Nd シンボルテーブルの型 .Sh 書式 .Fd #include .Sh 解説 .Aq Pa stab.h ファイルは a.out ファイルで使われる、シンボルテーブルのいくつかの .Fa n_type フィールド値の定義します。 これらは、恒久的なシンボル形式であり (つまり、ローカルなラベルなどではない)、古いデバッガである .Em sdb や Berkeley パスカルコンパイラ .Xr pc 1 で使われます。 .\" (訳注) BerkeleyパスカルコンパイラはFreeBSDディストリビューション .\" に含まれない。 .\" 1998/05/05 Takeshi MUTOH シンボルテーブルエントリは .Pa .stabs アセンブラディレクティブによって生成することができます。 ここでは、ダブルクオートで区切られた名前、シンボルの型、シンボルに ついての char 1 つと short 1 つ分の情報、 そして (通常はアドレスを示す) unsigned long の整数を指定できます。 アドレスフィールドに明示的なラベルを生成するのを避けるため、 .Pa .stabd ディレクティブを使い、現在の場所を指すようにすることができます。 もし名前が必要ない場合、 .Pa .stabn ディレクティブを使うことで、シンボルテーブルエントリを生成することができます。 ローダは、 .Pa .stab ディレクティブによって生成されたシンボルテーブルのエントリ順を変えないこと を保証します。 .Xr a.out 5 に記述されているように、シンボルテーブルの要素は以下の構造を持ちます。 .Bd -literal /* * シンボルテーブルエントリの書式 */ struct nlist { union { char *n_name; /* コア内部 (in-core) で使用 */ long n_strx; /* ファイル文字列表へのインデックス */ } n_un; unsigned char n_type; /* 型のフラグ */ char n_other; /* 使用されていない */ short n_desc; /* 以下の struct desc 参照 */ unsigned n_value; /* アドレスまたはオフセットまたは行 */ }; .Ed .Pp .Fa n_type フィールドの下位ビットは、シンボルをたかだか 1 つのセグメントに置くため に使用します。どのセグメントに置くかは .Aq Pa a.out.h 内で定義されている以下のマスクに基づきます。 これらのセグメントビットを設定しないようにすることで、シンボルをどの セグメントにも属さないようにすることができます。 .Bd -literal /* * n_type の単純な値 */ #define N_UNDF 0x0 /* 定義されていない */ #define N_ABS 0x2 /* 絶対指定 */ #define N_TEXT 0x4 /* テキスト */ #define N_DATA 0x6 /* データ */ #define N_BSS 0x8 /* bss */ #define N_EXT 01 /* 外部参照を表すビット(or して使う) */ .Ed .Pp シンボルの .Fa n_value フィールドは、リンカ .Xr ld 1 によって、正しいセグメント内のアドレスに再配置されます。 どのセグメントにも入っていないシンボルの .Fa n_value フィールドは、リンカによって変更されません。 さらに、 .Fa n_type フィールドで、以下のビットのいずれもセットされていない場合は、 リンカは自分が持っている規則にしたがって、 いくつかのシンボルを破棄します。 .Bd -literal /* * その他の永続的なシンボルテーブルエントリでは、N_STAB のいくつかのビットが * セットされています。これらは、 内に記述があります。 */ #define N_STAB 0xe0 /* もしこれらのビットのいずれかがセットされていれば破棄されません */ .Ed .Pp これで、112 (7 \(** 16) 個までのシンボルを、さまざまなセグメントで分けて 定義できるようになります。 これらのいくつかについては既に述べられています。 古いシンボリックデバッガ .Em sdb は、以下の n_type 値を使います。 .Bd -literal #define N_GSYM 0x20 /* グローバルシンボル : name,,0,type,0 */ #define N_FNAME 0x22 /* プロシジャ名 (f77 kludge): name,,0 */ #define N_FUN 0x24 /* プロシジャ: name,,0,linenumber,address */ #define N_STSYM 0x26 /* 静的シンボル: name,,0,type,address */ #define N_LCSYM 0x28 /* .lcomm シンボルl: name,,0,type,address */ #define N_RSYM 0x40 /* レジスタシンボル: name,,0,type,register */ #define N_SLINE 0x44 /* ソース行: 0,,0,linenumber,address */ #define N_SSYM 0x60 /* structure elt: name,,0,type,struct_offset */ #define N_SO 0x64 /* ソースファイル名: name,,0,0,address */ #define N_LSYM 0x80 /* ローカルシンボル: name,,0,type,offset */ #define N_SOL 0x84 /* #includeされたファイル名: name,,0,0,address */ #define N_PSYM 0xa0 /* パラメータ: name,,0,type,offset */ #define N_ENTRY 0xa4 /* 別のエントリ: name,linenumber,address */ #define N_LBRAC 0xc0 /* 左かっこ: 0,,0,nesting level,address */ #define N_RBRAC 0xe0 /* 右かっこ: 0,,0,nesting level,address */ #define N_BCOMM 0xe2 /* 共通の開始符号: name,, */ #define N_ECOMM 0xe4 /* 共通の終了符号: name,, */ #define N_ECOML 0xe8 /* (ローカル名の)共通の終了符号: ,,address */ #define N_LENG 0xfe /* 長さ情報を持った2番目の stab エントリ */ .Ed .Pp ここで、コメントには 与えられた .Fa n_type の .Fa n_name , .Fa n_other , .Fa n_desc , .Fa n_value フィールド と .Pa .stab .Fa s の典型的な利用法が書かれています。 .Em sdb は、ポータブル C コンパイラ .Xr cc 1 によって使われる形式の型の指定子を持っている .Fa n_desc フィールドを使います。これらの型の値のフォーマットの詳細はヘッダファイル .Pa pcc.h を参照して下さい。 .Pp Berkeley パスカルコンパイラ .Xr pc 1 は、以下の .Fa n_type 値をつかいます: .Bd -literal #define N_PC 0x30 /* グローバルなパスカルシンボル: name,,0,subtype,line */ .Ed .Pp と、以下のサブ型を使い、別々のコンパイルファイルにまたがる型チェックを 行います。 .Bd -unfilled -offset indent 1 ソースファイル名 2 インクルードされたファイル名 3 グローバルなラベル 4 グローバルな定数 5 グローバルな型 6 グローバルな変数 7 グローバルな関数 8 グローバルな手続き 9 外部関数 10 外部手続き 11 ライブラリ変数 12 ライブラリルーチン .Ed .Sh 関連項目 .Xr as 1 , .Xr ld 1 , .Xr a.out 5 .Sh バグ .Pp もっと基本的な形式が必要でしょう。 .Sh 歴史 .Nm stab ファイルは .Bx 4.0 から登場しました。