スポンサーリンク

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_typen_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)

バグ

もっと基本的な形式が必要でしょう。

歴史

stab ファイルは 4.0BSD から登場しました。

FreeBSD 10.0 June 5, 1993 FreeBSD 10.0

スポンサーリンク