STAB(5) — UNIX Programmer’s Manual
名称
stab − シンボルテーブルタイプ
形式
#include <stab.h>
解説
stab.h は、a.out ファイル内のシンボルテーブルの n_type フィールドに関する いくつかの値を定義します。これらは、古いデバッガ sdb およびバークレーの Pascal コンパイラ pc(1) によって使用されるパーマネントシンボル(すなわち、 ローカルラベルではないシンボルなど)に対するタイプです。 シンボルテーブルエントリの作成は、 .stabs アセンブラ擬似命令によって行うことができます。 この擬似命令を使用すれば、2重引用符で区切られた名称、 シンボルタイプ、そのシンボルに関する情報の 1つの文字および 1つのショートワード、符号なしのロングワード(普通はアドレス)を 指定することができます。 .stabd 擬似命令を使用すれば、現在位置を明示的にアドレス指定することができるため、 アドレスフィールドに明示的なラベルを作成する必要がなくなります。 名称が必要とされない場合には、 .stabn 擬似命令を使用することによって、 シンボルテーブルエントリを作成することができます。ローダは、 .stab 擬似命令によって作成されたシステムテーブルエントリの順番を保存します。 a.out(5) の項で説明されているように、 シンボルテーブルの要素は次の構造体から構成されています。
/∗
∗シンボルテーブルエントリのフォーマット
∗/
struct nlist{
union{
char∗n_name;/∗ インコアの場合に使用される ∗/
longn_strx;/∗ ファイル文字列テーブルへのインデックス ∗/
}n_un;
unsigned charn_type;/∗ タイプフラグ ∗/
charn_other;/∗ 未使用 ∗/
shortn_desc;/∗ 下記の struct desc を参照のこと ∗/
unsignedn_value;/∗ アドレス、オフセット、あるいは行番号 ∗/
};
<a.out.h> 内に定義されている次のようなマスクに従って最大 1つのセグメントに シンボルを入れるには、n_type フィールドの下位ビットを使用します。 これらのセグメントにシンボルを入れたくない場合には、 これらのセグメントビットを設定しないでください。
/∗
∗ n_type に関する簡単な値
∗/
#defineN_UNDF0x0/∗ 未定義 ∗/
#defineN_ABS0x2/∗ 絶対値 ∗/
#defineN_TEXT0x4/∗ テキスト ∗/
#defineN_DATA0x6/∗ データ ∗/
#defineN_BSS0x8/∗ bss ∗/
#defineN_EXT01/∗ 論理和のとられた外部ビット ∗/
シンボルの n_value フィールドは、適切なセグメント内のアドレスとして、 リンカ ld(1) によって再配置されます。どのセグメントにも存在しない シンボルの n_value フィールドは、リンカによる変更を受けません。 さらに、n_type フィールドが次のいずれかのビットを設定していない限り、 リンカは、独自のルールに従って特定のシンボルを破棄します。
/∗
∗ 他のパーマネントシンボルテーブルエントリは、いくつかの N_STAB ビットを
∗ 設定しています。これらのビットは <stab.h> 内にリストされます。
∗/
#defineN_STAB0xe0/∗ これらのビットのいずれかが設定されている場合には、破棄しない ∗/
このテーブルには、さまざまなセグメントに分割して最大 112(7 ∗ 16)種類の シンボルを収めることができます。 これらのシンボルの一部はすでに宣言されています。 古いシンボルデバッガ sdb は、次の n_type 値を使用します。
#defineN_GSYM0x20 /∗ グローバルシンボル: 名称,,0,タイプ,0 ∗/
#defineN_FNAME0x22 /∗ プロシージャ名(f77 クラッジ):名称,,0 ∗/
#defineN_FUN0x24 /∗ プロシージャ:名称,,0,行番号,アドレス ∗/
#defineN_STSYM0x26 /∗ 静的シンボル:名称,,0,タイプ,アドレス ∗/
#defineN_LCSYM0x28 /∗ .lcomm シンボル:名称,,0,タイプ,アドレス ∗/
#defineN_RSYM0x40 /∗ レジスタシンボル:名称,,0,タイプ,レジスタ ∗/
#defineN_SLINE0x44 /∗ src 行:0,,0,行番号,アドレス ∗/
#defineN_SSYM0x60 /∗ elt 構造体:名称,,0,タイプ,構造オフセット ∗/
#defineN_SO0x64 /∗ ソースファイル名:名称,,0,0,アドレス ∗/
#defineN_LSYM0x80 /∗ ローカルシンボル:名称,,0,タイプ,オフセット ∗/
#defineN_SOL0x84 /∗ #include されたファイル名:名称,,0,0,アドレス ∗/
#defineN_PSYM0xa0 /∗ パラメータ:名称,,0,タイプ,オフセット ∗/
#defineN_ENTRY0xa4 /∗ 代替エントリ:名称,行番号、アドレス ∗/
#defineN_LBRAC0xc0 /∗ 左括弧:0,,0,ネスティングレベル,アドレス ∗/
#defineN_RBRAC0xe0 /∗ 右括弧:0,,0,ネスティングレベル,アドレス ∗/
#defineN_BCOMM0xe2 /∗ begin common:名称,, ∗/
#defineN_ECOMM0xe4 /∗ end common:名称,, ∗/
#defineN_ECOML0xe8 /∗ end common(ローカル名):,,アドレス ∗/
#defineN_LENG0xfe /∗ 長さに関する情報を備えた 2番目の stab エントリ ∗/
ここで、コメントは、 .stabs、 および与えられた n_type の n_name、n_other、n_desc、 n_value フィールドに関する、従来の sdb の使用法を表します。 sdb は、Portable C Compiler で使用される形式のタイプ指定子を保持するために、 n_desc フィールドを使用します。 こうしたタイプ値のフォーマットに関する詳細については、 ヘッダファイル pcc.h の項を参照してください。
バークレーの Pascal コンパイラ pc(1) は、以下の n_type 値を使用します。
#defineN_PC0x30 /∗ グローバルパスカルシンボル:名称,,0,サブタイプ,行 ∗/
また、このコンパイラは、別個にコンパイルされるファイルに関するタイプの チェックを行うために以下のサブタイプを使用します。
1ソースファイル名
2インクルードされるファイル名
3グローバルラベル
4グローバル定数
5グローバルタイプ
6グローバル変数
7グローバル関数
8グローバルプロシージャ
9外部関数
10外部プロシージャ
11ライブラリ変数
12ライブラリルーチン
関連事項
as(1), ld(1), dbx(1), a.out(5)
バグ
もっと基本的なタイプが必要です。
NEWS-OSRelease 3.3