RELOC(5) — NEWS-OS Programmer’s Manual
名称
reloc − MIPS オブジェクトファイルの再配置情報
形式
#include <reloc.h>
解説
オブジェクトファイルは、テキストまたはデータ中の再配置可能なリファレンス それぞれについて、1 つの再配置エントリをもちます。 再配置情報がある場合、それは以下のフォーマットで書かれているでしょう。
structreloc
{
longr_vaddr ;/∗ (virtual) address of reference ∗/
longr_symndx ;/∗ index into symbol table ∗/
ushortr_type ;/∗ relocation type ∗/
unsignedr_symndx:24,/∗ index into symbol table ∗/
r_reserved:3,
r_type:4,/∗ relocation type ∗/
r_extern:1;/∗ if 1 symndx is an index into the external
symbol table, else symndx is a section # ∗/
} ;
/∗ Relocation types ∗/
#defineR_ABS0
#defineR_REFHALF1
#defineR_REFWORD2
#defineR_JMPADDR3
#defineR_REFHI4
#defineR_REFLO5
#defineR_GPREL6
#defineR_LITERAL7
/∗ Section numbers ∗/
#defineR_SN_NULL0
#defineR_SN_TEXT1
#defineR_SN_RDATA2
#defineR_SN_DATA3
#defineR_SN_SDATA4
#defineR_SN_SBSS5
#defineR_SN_BSS6
#defineR_SN_INIT7
#defineR_SN_LIT88
#defineR_SN_LIT49
リンクエディタは、各入力セクションを読み込み、再配置を行ないます。 再配置エントリは、入力セクション内で見つけられたリファレンスを扱う方法を 指示します。
r_extern が 0 の場合、それはローカルな再配置エントリで、 r_symndex は、セクション番号 (R_SN_∗) です。 これらのエントリの場合、セクション番号により参照されるセクションの開始 アドレスは、外部のシンボルテーブルエントリの値の代わりに使用されます。 アセンブラおよびローダは常に、再配置される項目がオブジェクトファイル内で 定義されている場合、ローカルな再配置エントリを使用します。
あらゆる外部再配置(R_ABS は除く)については、符号付きの定数は、 再配置エントリが参照するシンボルの仮想アドレスに加算されます。 この定数は、再配置中のアドレスでアセンブルされます。
R_ABS リファレンスは絶対番地で、再配置の必要はありません。 エントリは無視されます。
R_REFHALF シンボルの仮想アドレスに対する 16 ビットのリファレンス。
R_REFWORD シンボルの仮想アドレスに対する 32 ビットのリファレンス。
R_JMPADDR シンボルの仮想アドレスに対する 26 ビットの分岐命令リファレンス。
R_REFHI 上位 16 ビットのシンボルの仮想アドレスに対するリファレンス。 シンボルの仮想アドレスに付加される定数の適切な値は、 再構成することができるように、次の再配置エントリは、それに対応する R_REFLO エントリでなければなりません。
R_REFLO 下位 16 ビットのシンボルの仮想アドレスに対するリファレンス。
R_GPREL グローバルポインタレジスタからのシンボルの仮想アドレスに 対する 16 ビットのオフセット。
R_LITERAL グローバルポインタレジスタからのリテラルの仮想アドレスに 対する 16 ビットのオフセット。
再配置エントリは、アセンブラにより自動的に生成され、 リンクエディタにより自動的に使用されます。 リンクエディタオプションは、オブジェクトファイルに再配置エントリを保存したり、 削除したりするために存在します。
セクションに対する再配置エントリの数は、セクションヘッダの s_nreloc フィールドで見つけます。
このフィールドは、C 言語の短かさで、大きなオブジェクトだとあふれが 生じることもあります。 このフィールドがあふれた場合、セクションヘッダの s_flags フィールドは、 S_NRELOC_OVFL ビットがセットされます。 この場合、再配置エントリの真の数は、 そのセクションに対する最初の再配置エントリの r_vaddr フィールドで見つけます。 その再配置エントリは、型 R_ABS をもっているので、再配置が行われると無視されます。 これはわざ (kluge) です。
関連事項
RISC NEWS Assembly Language Programmer’s Guide の第 10 章。 “セクション再配置情報” という節。
as(1), ld(1), syms(5), scnhdr(5), a.out(5)
NEWS-OSRelease 4.2.1R