stab(5)
|
FreeBSD 一般コマンドマニュアル
|
stab
stab
解説
<stab.h> ファイルは a.out ファイルで使われる、シンボルテーブルのいくつか
の n_type フィールド値の定義します。これらは、恒久的なシンボル形式であり
(つまり、ローカルなラベルなどではない)、古いデバッガである sdb や Berke-
ley パスカルコンパイラ pc(1) で使われます。シンボルテーブルエントリは
.stabs アセンブラディレクティブによって生成することができます。ここでは、
ダブルクオートで区切られた名前、シンボルの型、シンボルについての char 1
つと short 1 つ分の情報、そして (通常はアドレスを示す) unsigned long の整
数を指定できます。アドレスフィールドに明示的なラベルを生成するのを避ける
ため、 .stabd ディレクティブを使い、現在の場所を指すようにすることができ
ます。もし名前が必要ない場合、 .stabn ディレクティブを使うことで、シンボ
ルテーブルエントリを生成することができます。ローダは、 .stab ディレクティ
ブによって生成されたシンボルテーブルのエントリ順を変えないことを保証しま
す。 a.out(5) に記述されているように、シンボルテーブルの要素は以下の構造
を持ちます。
/*
* シンボルテーブルエントリの書式
*/
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; /* アドレスまたはオフセットまたは行 */
};
n_type フィールドの下位ビットは、シンボルをたかだか 1 つのセグメントに置
くために使用します。どのセグメントに置くかは <a.out.h> 内で定義されている
以下のマスクに基づきます。これらのセグメントビットを設定しないようにする
ことで、シンボルをどのセグメントにも属さないようにすることができます。
/*
* 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 して使う) */
シンボルの n_value フィールドは、リンカ ld(1) によって、正しいセグメント
内のアドレスに再配置されます。どのセグメントにも入っていないシンボルの
n_value フィールドは、リンカによって変更されません。さらに、 n_type フィ
#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 エントリ */
ここで、コメントには与えられた n_type の n_name, n_other, n_desc, n_value
フィールドと .stab s の典型的な利用法が書かれています。 sdb は、ポータブ
ル C コンパイラ cc(1) によって使われる形式の型の指定子を持っている n_desc
フィールドを使います。これらの型の値のフォーマットの詳細はヘッダファイル
pcc.h を参照して下さい。
Berkeley パスカルコンパイラ pc(1) は、以下の n_type 値をつかいます:
#define N_PC 0x30 /* グローバルなパスカルシンボル: name,,0,subtype,line */
と、以下のサブ型を使い、別々のコンパイルファイルにまたがる型チェックを行
います。
1 ソースファイル名
2 インクルードされたファイル名
3 グローバルなラベル
4 グローバルな定数
5 グローバルな型
6 グローバルな変数
7 グローバルな関数
8 グローバルな手続き
9 外部関数
10 外部手続き
11 ライブラリ変数
12 ライブラリルーチン
関連項目
as(1), ld(1), a.out(5)
バグ
もっと基本的な形式が必要でしょう。