Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ a.out(5) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

adb(1)

as(1)

ld(1)

nm(1)

dbx(1)

stab(5)

strip(1)

A.OUT(5)  —  NEWS-OS Programmer’s Manual

名称

a.out − アセンブラおよびリンクエディタの出力

形式

#include<a.out.h>

解説

a.out は、アセンブラ as(1) およびリンクエディタ ld(1) の出力ファイルです。エラーや未処理の外部参照が存在しない場合には、 どちらのプログラムも実行可能な a.out ファイルを作ります。NEWSのインクルードファイルに収められている レイアウト情報は次の通りです。

/∗

∗ それぞれの a.out ファイルのヘッダ

∗/
struct exec {
longa_magic;/∗ マジックナンバー ∗/
unsigneda_text;/∗ テキストセグメントのサイズ ∗/
unsigneda_data;/∗ 初期化済みデータのサイズ ∗/
unsigneda_bss;/∗ 初期化されていないデータのサイズ ∗/
unsigneda_syms;/∗ シンボルテーブルのサイズ ∗/
unsigneda_entry;/∗ エントリポイント ∗/
unsigneda_trsize;/∗ テキスト再配置情報のサイズ ∗/
unsigneda_drsize;/∗ データ再配置情報のサイズ ∗/
};
 #defineOMAGIC0407/∗ 一貫性のない古いフォーマット ∗/
#defineNMAGIC0410/∗ 読み取り専用テキスト ∗/
#defineZMAGIC0413/∗ 要求時ロードフォーマット ∗/
 /∗

∗ exec 構造体を引数とみなし、そのファイルがテキスト|シンボル|文字列

∗ に対して妥当なマジックナンバーあるいはオフセットを備えているかどうかを

∗ 知らせるマクロ

∗/
 #definePAGSIZ 4096
 #defineN_BADMAG(x) \
(((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC)
 #defineN_TXTOFF(x) \
((x).a_magic==ZMAGIC ? PAGSIZ : sizeof (struct exec))
#defineN_SYMOFF(x) \
(N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize)
#defineN_STROFF(x) \
(N_SYMOFF(x) + (x).a_syms)

ファイル内には、ヘッダ、プログラムテキストおよびデータ、 再配置情報、シンボルテーブル、文字列テーブルの順番に、5つの セクションがあります。プログラムが ld の‘−s’オプションと共にロードされた場合、あるいは、 シンボルおよび再配置情報が strip(1) によって削除されている場合には、最後の 3つのセクションは省かれます。

ヘッダ内において、各セクションのサイズはバイト単位で表されます。 ヘッダのサイズは、他のサイズには加算されません。
 
a.out ファイルが実行されると、3つの論理セグメント、テキストセグメント、 データセグメント(初期化さえるデータの後に、初期化されていないデータが おかれる。これは初めはオール0である)、 スタックがセットアップされます。 テキストセグメントは、コアイメージにおいて 0 から始まります。 ヘッダはロードされません。ヘッダ内のマジック番号が OMAGIC(0407)である場合、 テキストセグメントが書き込み保護されず、共有されないことを示すものであり、 従って、データセグメントは、テキストセグメントと隣接しています。 これは、最も古い種類の実行可能プログラムであり、 稀にしか使用されません。マジック番号が NMAGIC(0410)あるいは ZMAGIC(0413)である場合、データセグメントは、テキストセグメント の後の最初の PAGSIZ (4096) 境界から始まり、 テキストセグメントへのプログラムによる書き込みは行えません。 他のプロセスが同じファイルを実行している場合には、 テキストセグメントが共用されることになります。 ZMAGIC フォーマットについては、 a.out ファイル内の PAGSIZ バイト境界からテキストセグメントが始まり、 最初のブロック内のヘッダよりも後にある残りのバイトは予約され、 ゼロになっていなければなりません。 この場合、テキストとデータはどちらも PAGSIZ バイトの倍数でなければならず、 ファイルのページは、必要に応じて実行イメージに持ち込まれることになり、 他のフォーマットのように事前にロードされることはありません。 これは、特に、非常に大きなプログラムに適したものであり、 ld(1) によって生成されるデフォルトフォーマットです。

スタックは、コアイメージ内において最も上位の記憶位置を占有し、 USRSTACK (< machine/vmparam.h>) で宣言されている値から 下位のアドレス方向に伸びていきます。 スタックは必要に応じて自動的に拡張されます。データセグメントは、 brk(2) によって要求された場合に限って拡張されます。

ファイル内のヘッダの後には、テキスト、データ、テキスト再配置情報、 データ再配置情報、シンボルテーブル、文字列テーブル がこの順に収められます。ZMAGIC フォーマットについては、 テキストは、ファイル内の PAGSIZ バイト目から始まり、 他のフォーマットについては、ヘッダの直後から始まります。 引数として exec 構造体の名前が与えられた時、 N_TXTOFF マクロはこのファイルの絶対位置を戻します。 データセグメントは、テキストの後ろに隣接しており、そのすぐ後に、 テキスト再配置情報、データ再配置情報が続きます。 シンボルテーブルは、これらの後に収められ、 その位置は N_SYMOFF マクロによって計算されます。 最後に、文字列テーブルがシンボルテーブル の直後に収められ、 その位置は N_STROFF を使用することによって簡単に 算出することができます。 文字列テーブルの最初の 4バイトは、 実際に文字列を記憶に使用されるのではなく、 その文字列テーブル のサイズが収められます。 テーブルのサイズにはこの 4バイトが常に含まれることになるため、 4バイトというのが文字列テーブルの最小サイズになります。

シンボルテーブルのエントリの配置およびシンボルの型を区別する 主なフラグの値は、インクルードファイルに次のように記述されています。

/∗

∗ シンボルテーブルエントリのフォーマット

∗/
struct nlist {
union {
char∗n_name;/∗ コア内の場合に使用される ∗/
longn_strx;/∗ ファイル文字列テーブルへのインデックス ∗/
} n_un;
unsigned charn_type;/∗ タイプフラグ(例えば N_TEXT など。以下を参照) ∗/
charn_other;
shortn_desc;/∗ <stab.h>を参照 ∗/
unsignedn_value;/∗ このシンボルの値(あるいはオフセット)∗/
};
#definen_hashn_desc/∗ ld によって内部的に使用される ∗/
 /∗

∗ n_type に関する単純値

∗/
#defineN_UNDF0x0/∗ 未定義 ∗/
#defineN_ABS0x2/∗ 絶対値 ∗/
#defineN_TEXT0x4/∗ テキスト ∗/
#defineN_DATA0x6/∗ データ ∗/
#defineN_BSS0x8/∗ bss ∗/
#defineN_COMM0x12/∗(ld の内部で)共通 ∗/
#defineN_FN0x1f/∗ ファイル名シンボル ∗/
 #defineN_EXT01/∗ 論理和のとられた外部ビット ∗/
#defineN_TYPE0x1e/∗ すべてのタイプビット用のマスク ∗/
/∗

∗ 他の固定シンボルテーブルエントリには N_STAB ビットセットの一部が

∗ セットされている。これらのビットは <stab.h> に収められている。

∗/
#defineN_STAB0xe0/∗ これらのビットが 1ビットでもセットされていれば、
                       無視してはならない ∗/
 /∗

∗ namelist 値のフォーマット

∗/
#defineN_FORMAT"%08x"

a.out ファイルにおいては、シンボルの n_un.n_strx フィールドが、文字列 テーブルへのインデックスを提供します。 n_strx 値が 0 である場合には、 特定のシンボルテーブルエントリに名称が定義されていないことを意味します。 n_un.n_name フィールドによってシンボル名を参照できるのは、 プログラムが文字列テーブル内の n_strx および適切なデータを使用して シンボル名の設定を行った場合に限られます。

シンボルのタイプが“未定義の外部”であり、値のフィールドが 非ゼロである場合には、そのシンボルは、ローダ ld により、シンボルの値によってサイズが示されている共通領域の 名称として解釈されます。

未定義の外部シンボルに対する参照の一部ではないテキストあるいはデータ内の値は、 そのファイルの実行時に実際にメモリ内に現れることになる値です。 テキストあるいはデータ内のバイトが、再配置情報によって示される 未定義の外部シンボルに対する参照を含んでいる場合には、 ファイル内に格納された値は、関連した外部シンボルからのオフセットとなります。 ファイルがリンクエディタによって処理され、 外部シンボルが定義された状態になると、 シンボルの値はファイル内のバイト群に追加されます。

再配置情報が存在する場合、その情報は次のような構造体内で、 1つの再配置データにつき 8バイトに相当します。

/∗

∗ 再配置データのフォーマット

∗/
struct relocation_info {
intr_address;/∗ 再配置されるアドレス ∗/
unsignedr_symbolnum:24,/∗ ローカルシンボル序数 ∗/
r_pcrel:1, /∗ すでに相対 PC が再配置されたもの ∗/
r_length:2,/∗ 0=バイト、1=ワード、2=ロングワード ∗/
r_extern:1,/∗ 参照されるシンボルの値を含まない ∗/
:4;/∗ 現在、なし ∗/
};

a_trsize+a_drsize==0 である場合には、再配置情報は存在しません。 r_extern が 0 である場合には、r_symbolnum は、 その再配置の n_type になります (例えば、元のセグメントテキストに関係していることを意味する N_TEXT など)。

関連事項

adb(1), as(1), ld(1), nm(1), dbx(1), stab(5), strip(1)

バグ

文字列テーブルのサイズがヘッダ内に入っていないことは欠点ですが、 ヘッダのサイズを大きくすると、ストリップ実行ファイルが 互換性を失うことになるため、今のところこの欠点を解消することはできません。

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026