STAB(5) FreeBSD ファイルフォーマットマニュアル STAB(5)
名称
stab − シンボルテーブルの型 |
書式
#include <stab.h> |
解説
<stab.h> ファイルは a.out ファイルで使われる、シンボルテーブルのいくつか の n_type フィールド値を定義します。これらは、恒久的なシンボル形式であり (つまり、ローカルなラベルなどではない)、古いデバッガである sdb や Berkeley パスカルコンパイラ 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 フィールドで、以下のビットのいずれもセットされていない場合は、リンカは自 分が持っている規則にしたがって、いくつかのシンボルを破棄します。 /* * その他の永続的なシンボルテーブルエントリでは、N_STAB のいくつかのビットが * セットされています。これらは、<stab.h> 内に記述があります。 */ |
#define |
N_STAB |
0xe0 |
/* もしこれらのビットのいずれかがセットされていれば破棄されません */ |
これで、112 (7 ∗ 16) 個までのシンボルを、さまざまなセグメントで分けて定義 できるようになります。これらのいくつかについては既に述べられています。古 いシンボリックデバッガ sdb は、以下の 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 ソースファイル名 |
インクルードされたファイル名 |
|||
グローバルなラベル |
|||
グローバルな定数 |
|||
グローバルな型 |
|||
グローバルな変数 |
|||
グローバルな関数 |
|||
グローバルな手続き |
|||
外部関数 |
|||
外部手続き |
|||
ライブラリ変数 |
|||
ライブラリルーチン |
関連項目
バグ
もっと基本的な形式が必要でしょう。 |
歴史
stab ファイルは 4.0BSD から登場しました。 FreeBSD 10.0 June 5, 1993 FreeBSD 10.0 |