Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ scnhdr(5) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ld(1)

fseek(3S)

reloc(5)

a.out(5)

SCNHDR(5)  —  NEWS-OS Programmer’s Manual

名称

scnhdr − MIPS オブジェクトファイルのセクションヘッダ

形式

#include <scnhdr.h>

解説

MIPS オブジェクトファイルは、ファイル上の データのレイアウトを 指定するためにセクションヘッダのテーブルをもっています。 オブジェクトファイル内の各セクションは、自身のヘッダをもっています。 C 構造体は以下のとおりです。

struct scnhdr
{
chars_name[8];/∗ section name ∗/
longs_paddr;/∗ physical address, aliased s_nlib ∗/
longs_vaddr;/∗ virtual address ∗/
longs_size;/∗ section size ∗/
longs_scnptr;/∗ file ptr to raw data for section ∗/
longs_relptr;/∗ file ptr to relocation ∗/
longs_lnnoptr;/∗ file ptr to gp table ∗/
unsigned shorts_nreloc;/∗ number of relocation entries ∗/
unsigned shorts_nlnno;/∗ number of gp table entries ∗/
longs_flags;/∗ flags ∗/
};

ファイルポインタは、ファイルへのバイトオフセットです。 すなわち、これらは FSEEK へのコールでオフセットとして使用することが できます( ldfcn(3X) 参照)。 セクションが初期化されている場合、ファイルは、実際のバイトを含みます。 初期化されていないセクションは、多少異なります。 これはセクション内で定義されたサイズとシンボル、そしてそれを参照する シンボルをもちます。 しかし、初期化されていないセクションは、再配置エントリまたはデータを もちません。 したがって、オブジェクトファイル中に生のデータをもたず、 s_scnptr、s_relptr および s_nreloc に対する値は 0 です。

行番号を参照するエントリ (s_lnnoptr と s_nlnno) は、RISC NEWS マシン上の行番号に対しては使用されません。 行番号テーブルに達するためのエントリに対するヘッダファイル sym.h を参照してください。 セクションヘッダ中の行番号のためのエントリは、RISC NEWS マシン上の gp テーブル に対して使用されます。

セクションに対する再配置エントリの数は、セクションヘッダの s_nreloc フィールドで示されます。 このフィールドは、C 言語の短かさなので、大きなオブジェクトでは、 あふれが生じるかもしれません。 このフィールドがあふれた場合、セクションヘッダの s_flags フィールド内の、 S_NRELOC_OVFL ビットはセットされます。 この場合、再配置エントリの真の数は、そのセクションに対する最初の 再配置エントリの r_vaddr フィールドで見つけられます。 その再配置エントリは、型 R_ABS をもっているので、再配置が行われると無視されます。 これはわざ (kluge) です。

gp テーブルは、コンパイラオプション −G num (常に 0 を含みます)の適切な値それぞれに対応するセクションサイズを 与えます。 それは、一番小さいサイズ順にソートされます。 それは、セクションヘッダ中の s_lnnoptr フィールドにより指され、そのエントリ数(ヘッダを含む)は、 セクションヘッダ中の s_nlnno フィールドにあります。 このテーブルは、 .sdata および .sbss セクションに対してだけ存在します。 “小さな” セクション(.sdata または .sbss )がない場合、 それに対する gp テーブルは、それに対応する “大きな” セクションに 付加されるので、 情報は、今までどおり、リンクエディタの ld(1) に達することができます。 gp テーブルに対する C ユニオンは以下のとおりです。

union gp_table
{
struct {
longcurrent_g_value;/∗ actual value ∗/
longunused;
} header;
struct {
longg_value;/∗ hypothetical value ∗/
longbytes;/∗ section size corresponding to hypothetical value ∗/
} entry;
};

各 gp テーブルは、オブジェクトファイルをつくるために使用する −G num オプションの実際の値を含むヘッダ構造体1つをもちます。 エントリは、 −G num オプションのあらゆるアプリケーション値に対して存在しなければなりません。 適切な値はすべて、そのセクション中のデータ項目のサイズです。

.lib セクションの場合、共有ライブラリの数は、 s_nlib フィールド( s_paddr に対する別名)内にあります。 .lib セクションは、共有ライブラリの s_nlib 記述からなります。 共有ライブラリの各記述は、次にその共有ライブラリへのパス名が続く libscn 構造体です。 C 構造体は以下のとおりで、 scnhdr.h で定義されます。

struct libscn
{
longsize;/∗ size of this entry (including target name) ∗/
longoffset;/∗ offset from start of entry to target name ∗/
longtsize;/∗ text size in bytes, padded to DW boundary ∗/
longdsize;/∗ initialized data size ∗/
longbsize;/∗ uninitialized data ∗/
longtext_start;/∗ base of text used for this library ∗/
longdata_start;/∗ base of data used for this library ∗/
longbss_start;/∗ base of bss used for this library ∗/
/∗ pathname of target shared library ∗/
};

関連事項

ld(1), fseek(3S), reloc(5), a.out(5)

NEWS-OSRelease 4.2.1R

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