610 lines
17 KiB
Groff
610 lines
17 KiB
Groff
.\" Copyright (c) 1993 Paul Kranenburg
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by Paul Kranenburg.
|
|
.\" 3. The name of the author may not be used to endorse or promote products
|
|
.\" derived from this software without specific prior written permission
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.\" %FreeBSD: src/share/man/man5/link.5,v 1.28 2004/07/03 18:29:23 ru Exp %
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd October 23, 1993
|
|
.Dt LINK 5
|
|
.Os
|
|
.Sh 名称
|
|
.Nm link
|
|
.Nd ダイナミックローダとリンクエディタインタフェース
|
|
.Sh 書式
|
|
.In sys/types.h
|
|
.In nlist.h
|
|
.In link.h
|
|
.Sh 解説
|
|
インクルードファイル
|
|
.In link.h
|
|
では、ダイナミックにリンクされたプログラムやライブラリに含まれる
|
|
数種の構造体が宣言されています。
|
|
その構造体は、リンクエディタとローダ機構のいくつかの構成要素間の
|
|
インタフェースを定義します。
|
|
バイナリ中でのこれらの構造体のレイアウトは
|
|
多くの点で a.out 形式に類似しており、
|
|
シンボル定義 (付随する文字列テーブルを含む) や外部エンティティへの参照を
|
|
解決するのに必要なリロケーションレコードといった、
|
|
よく似た機能を提供します。
|
|
それに加え、ダイナミックロードとリンク処理に固有のいくつかのデータ構造も
|
|
記録しています。このようなデータ構造としては、
|
|
リンクエディット処理を完結するのに必要な他のオブジェクトへの参照や、
|
|
異なるプロセス間でコードページの共有を進めるための
|
|
.Em 位置独立コード
|
|
(Position Independent Code 略して PIC) を機能させるための
|
|
間接テーブルがあります。
|
|
ここで述べるデータ構造全体を
|
|
.Em ランタイムリロケーションセクション (RRS)
|
|
と呼び、ダイナミックにリンクされるプログラムや共有オブジェクトの
|
|
標準テキスト及びデータセグメントに埋め込まれます。
|
|
これは、既存の
|
|
.Xr a.out 5
|
|
形式には RRS のための場所が他にないからです。
|
|
.Pp
|
|
あるプログラムを実行可能とする処理が、
|
|
システムリソースの使用を最適化しつつ正しく完了するよう、
|
|
複数のユーティリティが協調して働きます。
|
|
コンパイラは PIC コードを出力し、
|
|
それから
|
|
.Xr ld 1
|
|
によって共有ライブラリが作られます。
|
|
コンパイラはまた、初期化される各データアイテムのサイズ情報を
|
|
アセンブラディレクティブ .size を用いて記録します。
|
|
PIC コードは、ある間接テーブルを通じてデータ変数にアクセスする点で
|
|
従来のコードと異なっています。
|
|
この表はグローバルオフセットテーブルと呼ばれ、
|
|
慣習によって、予約名
|
|
.Dv _GLOBAL_OFFSET_TABLE_
|
|
によってアクセス可能です。
|
|
ここで用いられるメカニズムの詳細は機種依存ですが、通常は
|
|
そのマシンのレジスタ 1 本がこの用途に予約されます。
|
|
このような仕組みの背景にある合理性は、
|
|
実際のロードアドレスとは独立したコードを生成することです。
|
|
実行時には、アドレス空間において様々な共有オブジェクトがロードされるアドレス
|
|
に応じて、グローバルオフセットテーブルに含まれる値のみ変更すればよいのです。
|
|
.Pp
|
|
同様に、大域的に定義された関数の呼び出しは、
|
|
コアイメージのデータセグメント中に置かれている
|
|
プロシージャリンケージテーブル (PLT) を通じて間接的に行われます。
|
|
これもまた、実行時にテキストセグメントを修正せずに済ませるためのものです。
|
|
.Pp
|
|
リンクエディタがグローバルオフセットテーブルとプロシージャリンケージテーブルを
|
|
配置するのは、
|
|
複数の PIC オブジェクトファイルを結合して
|
|
プロセスのアドレス空間にマップするのに適した 1 つのイメージにする時です。
|
|
リンクエディタはまた、実行時のリンクエディタが必要とする全てのシンボルを集め、
|
|
それらをイメージのテキストとデータのビット列と共にストアします。
|
|
もう 1 つの予約シンボル
|
|
.Em _DYNAMIC
|
|
は、実行時のリンク構造が存在することを示すのに用いられます。
|
|
_DYNAMIC が 0 にリロケートされる場合は、実行時リンクエディタを起動する
|
|
必要はありません。
|
|
もし _DYNAMIC が非 0 なら、_DYNAMIC は、必要なリロケーション情報と
|
|
シンボル情報の位置を引き出すことができるデータ構造を指しています。
|
|
これは特に、スタートアップモジュール
|
|
.Em crt0
|
|
で利用されます。
|
|
慣習として、_DYNAMIC 構造体は、
|
|
それが属するイメージのデータセグメントの最初に置かれます。
|
|
.Sh データ構造
|
|
ダイナミックリンクと実行時リロケーションをサポートするデータ構造は、
|
|
それらの処理の適用対象イメージのテキスト及びデータセグメントの
|
|
両方の中にあります。
|
|
テキストセグメントにはシンボル記述や名前といった読み取り専用データが含まれ、
|
|
他方データセグメントにはリロケーション処理で更新する必要のあるテーブル類が
|
|
含まれます。
|
|
.Pp
|
|
シンボル _DYNAMIC は
|
|
.Fa _dynamic
|
|
構造体を参照します:
|
|
.Bd -literal -offset indent
|
|
struct _dynamic {
|
|
int d_version;
|
|
struct so_debug *d_debug;
|
|
union {
|
|
struct section_dispatch_table *d_sdt;
|
|
} d_un;
|
|
struct ld_entry *d_entry;
|
|
};
|
|
.Ed
|
|
.Bl -tag -width d_version
|
|
.It Fa d_version
|
|
このフィールドは異なったバージョンのダイナミックリンク実装用に
|
|
提供されています。
|
|
.Xr ld 1
|
|
及び
|
|
.Xr ld.so 1
|
|
が理解する現在のバージョン番号は、
|
|
.Tn SunOS
|
|
4.x リリースで用いられている
|
|
.Em LD_VERSION_SUN (3)
|
|
と、
|
|
.Fx 1.1
|
|
以来使用されている
|
|
.Em LD_VERSION_BSD (8)
|
|
です。
|
|
.It Fa d_un
|
|
.Em d_version
|
|
に応じたデータ構造を参照します。
|
|
.It Fa so_debug
|
|
このフィールドは、
|
|
共有オブジェクトのシンボルテーブルをアクセスするためのフックを
|
|
デバッガに提供します。
|
|
この共有オブジェクトは、
|
|
実行時リンクエディタの処理の結果ロードされたものです。
|
|
.El
|
|
.Pp
|
|
.Fa section_dispatch_table
|
|
構造体がメインとなる
|
|
.Dq ディスパッチャ
|
|
テーブルであり、
|
|
イメージ内で様々なシンボル情報やリロケーション情報が置かれるセグメントへの
|
|
オフセットを保持します。
|
|
.Bd -literal -offset indent
|
|
struct section_dispatch_table {
|
|
struct so_map *sdt_loaded;
|
|
long sdt_sods;
|
|
long sdt_filler1;
|
|
long sdt_got;
|
|
long sdt_plt;
|
|
long sdt_rel;
|
|
long sdt_hash;
|
|
long sdt_nzlist;
|
|
long sdt_filler2;
|
|
long sdt_buckets;
|
|
long sdt_strings;
|
|
long sdt_str_sz;
|
|
long sdt_text_sz;
|
|
long sdt_plt_sz;
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Bl -tag -width sdt_filler1
|
|
.It Fa sdt_loaded
|
|
ロードされた最初のリンクマップ (後述) へのポインタ。
|
|
このフィールドは
|
|
.Nm ld.so
|
|
によって設定されます。
|
|
.It Fa sdt_sods
|
|
.Em この
|
|
オブジェクトが必要とする共有オブジェクト記述子の (リンク) リストの先頭。
|
|
.It Fa sdt_filler1
|
|
使用しないで下さい (SunOS では
|
|
ライブラリの検索ルールを指定するのに使用されていました)。
|
|
.It Fa sdt_got
|
|
このイメージ中でのグローバルオフセットテーブルの位置。
|
|
.It Fa sdt_plt
|
|
このイメージ中でのプロシージャリンケージテーブルの位置。
|
|
.It Fa sdt_rel
|
|
実行時のリロケーションを指定する
|
|
.Fa relocation_info
|
|
構造体 (
|
|
.Xr a.out 5
|
|
参照)
|
|
の配列の位置。
|
|
.It Fa sdt_hash
|
|
このオブジェクトのシンボルテーブルでシンボル検索を高速化するための
|
|
ハッシュテーブルの位置。
|
|
.It Fa sdt_nzlist
|
|
シンボルテーブルの位置。
|
|
.It Fa sdt_filler2
|
|
現在使用されていません。
|
|
.It Fa sdt_buckets
|
|
.Fa sdt_hash
|
|
中のバケット数。
|
|
.It Fa sdt_strings
|
|
.Fa sdt_nzlist
|
|
に対応するシンボル文字列テーブルの位置。
|
|
.It Fa sdt_str_sz
|
|
文字列テーブルのサイズ。
|
|
.It Fa sdt_text_sz
|
|
このオブジェクトのテキストセグメントのサイズ。
|
|
.It Fa sdt_plt_sz
|
|
プロシージャリンケージテーブルのサイズ。
|
|
.El
|
|
.Pp
|
|
.Fa sod
|
|
構造体は、それを含むオブジェクトのリンクエディット処理を完了するのに
|
|
必要な共有オブジェクトを記述します。
|
|
そのようなオブジェクトのリスト (
|
|
.Fa sod_next
|
|
で連結されます)
|
|
は section_dispatch_table 構造体の
|
|
.Fa sdt_sods
|
|
によって指し示されます。
|
|
.Bd -literal -offset indent
|
|
struct sod {
|
|
long sod_name;
|
|
u_int sod_library : 1,
|
|
sod_reserved : 31;
|
|
short sod_major;
|
|
short sod_minor;
|
|
long sod_next;
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Bl -tag -width sod_library
|
|
.It Fa sod_name
|
|
このリンクオブジェクトを記述する文字列の、
|
|
テキストセグメントにおけるオフセット。
|
|
.It Fa sod_library
|
|
もし設定されていれば、
|
|
.Fa sod_name
|
|
は
|
|
.Nm ld.so
|
|
が検索することになるライブラリを指定します。
|
|
そのパス名は、あるディレクトリ群 (
|
|
.Xr ldconfig 8
|
|
参照)
|
|
で
|
|
.Em lib\&<sod_name>\&.so.n.m
|
|
にマッチする共有オブジェクトを検索することで得られます。
|
|
もし設定されていなければ、
|
|
.Fa sod_name
|
|
は希望する共有オブジェクトに対するフルパス名を指し示す必要があります。
|
|
.It Fa sod_major
|
|
ロードすべき共有オブジェクトのメジャーバージョン番号を指定します。
|
|
.It Fa sod_minor
|
|
ロードすべき共有オブジェクトの希望するマイナバージョン番号を指定します。
|
|
.El
|
|
.Pp
|
|
プロセスのアドレス空間にロードされる共有オブジェクト全てを追跡するために、
|
|
実行時リンクエディタは
|
|
.Em リンクマップ
|
|
と呼ばれる構造体のリストを管理しています。
|
|
これらの構造体は実行時にのみ用いられ、
|
|
実行可能ファイルや共有ライブラリのテキストあるいはデータセグメントには
|
|
ありません。
|
|
.Bd -literal -offset indent
|
|
struct so_map {
|
|
caddr_t som_addr;
|
|
char *som_path;
|
|
struct so_map *som_next;
|
|
struct sod *som_sod;
|
|
caddr_t som_sodbase;
|
|
u_int som_write : 1;
|
|
struct _dynamic *som_dynamic;
|
|
caddr_t som_spd;
|
|
};
|
|
.Ed
|
|
.Bl -tag -width som_dynamic
|
|
.It Fa som_addr
|
|
このリンクマップに対応する共有オブジェクトがロードされるアドレス。
|
|
.It Fa som_path
|
|
ロードされるオブジェクトのフルパス名。
|
|
.It Fa som_next
|
|
次のリンクマップへのポインタ。
|
|
.It Fa som_sod
|
|
この共有オブジェクトのロードをつかさどる
|
|
.Fa sod
|
|
構造体。
|
|
.It Fa som_sodbase
|
|
最近のバージョンの実行時リンカでは捨てられています。
|
|
.It Fa som_write
|
|
このオブジェクトのテキストセグメント (の一部分) が現在書き込み可能である
|
|
場合にセットされます。
|
|
.It Fa som_dynamic
|
|
このオブジェクトの
|
|
.Fa _dynamic
|
|
構造体へのポインタ。
|
|
.It Fa som_spd
|
|
実行時リンクエディタが管理するプライベートデータと連結するためのフック。
|
|
.El
|
|
.Pp
|
|
サイズ付きシンボル記述。
|
|
これは単に
|
|
.Fa nlist
|
|
構造体にフィールド
|
|
.Pq Fa nz_size
|
|
を 1 つ追加したものです。
|
|
共有オブジェクトのデータセグメントにあるアイテムの
|
|
サイズ情報を伝達するのに用いられます。
|
|
この構造体の配列は共有オブジェクトのテキストセグメントに存在し、
|
|
そのアドレスは
|
|
.Fa section_dispatch_table
|
|
の
|
|
.Fa sdt_nzlist
|
|
フィールドで指定されます。
|
|
.Bd -literal -offset indent
|
|
struct nzlist {
|
|
struct nlist nlist;
|
|
u_long nz_size;
|
|
#define nz_un nlist.n_un
|
|
#define nz_strx nlist.n_un.n_strx
|
|
#define nz_name nlist.n_un.n_name
|
|
#define nz_type nlist.n_type
|
|
#define nz_value nlist.n_value
|
|
#define nz_desc nlist.n_desc
|
|
#define nz_other nlist.n_other
|
|
};
|
|
.Ed
|
|
.Bl -tag -width nz_size
|
|
.It Fa nlist
|
|
(
|
|
.Xr nlist 3
|
|
参照)。
|
|
.It Fa nz_size
|
|
このシンボルで表現されるデータのサイズ。
|
|
.El
|
|
.Pp
|
|
実行時のリンクエディットで行われるシンボル検索を高速化するため、
|
|
共有オブジェクトのテキストセグメントにハッシュテーブルが含まれています。
|
|
.Fa section_dispatch_table
|
|
の
|
|
.Fa sdt_hash
|
|
フィールドは
|
|
.Fa rrs_hash
|
|
構造体を指し示します:
|
|
.Bd -literal -offset indent
|
|
struct rrs_hash {
|
|
int rh_symbolnum; /* シンボル番号 */
|
|
int rh_next; /* 次のハッシュエントリ */
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Bl -tag -width rh_symbolnum
|
|
.It Fa rh_symbolnum
|
|
共有オブジェクトのシンボルテーブル (
|
|
.Fa ld_symbols
|
|
で与えられます) での当該シンボルのインデックス。
|
|
.It Fa rh_next
|
|
衝突が起きたとき、このフィールドはこのハッシュテーブルのバケットにおける
|
|
次のエントリのオフセットを保持します。
|
|
最終バケット要素の場合は 0 となります。
|
|
.El
|
|
.Fa rt_symbol
|
|
構造体は、
|
|
実行時にアロケートされるコモン(commons)と
|
|
共有オブジェクトからコピーされるデータアイテムを
|
|
追跡するのに用いられます。
|
|
これらのアイテムはリンクリストで管理され、デバッガでの利用のために
|
|
.Fa so_debug
|
|
構造体 (後述) 中の
|
|
.Fa dd_cc
|
|
フィールドによって公開されます。
|
|
.Bd -literal -offset indent
|
|
struct rt_symbol {
|
|
struct nzlist *rt_sp;
|
|
struct rt_symbol *rt_next;
|
|
struct rt_symbol *rt_link;
|
|
caddr_t rt_srcaddr;
|
|
struct so_map *rt_smp;
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Bl -tag -width rt_scraddr
|
|
.It Fa rt_sp
|
|
シンボル記述。
|
|
.It Fa rt_next
|
|
次の rt_symbol の仮想アドレス。
|
|
.It Fa rt_link
|
|
ハッシュバケットにおける次の要素。
|
|
.Nm ld.so
|
|
の内部で用いられます。
|
|
.It Fa rt_srcaddr
|
|
共有オブジェクト中での初期化済データのソース位置。
|
|
.It Fa rt_smp
|
|
この実行時シンボルが記述するデータの元のソースとなる共有オブジェクト。
|
|
.El
|
|
.Pp
|
|
.Fa so_debug
|
|
構造体は、
|
|
実行時リンクエディットの結果、当該プロセスのアドレス空間にロードされた
|
|
あらゆる共有オブジェクトの情報を得るために、
|
|
デバッガによって利用されます。
|
|
実行時リンクエディタはプロセスの初期化処理の一部として実行されるため、
|
|
共有オブジェクトからシンボルにアクセスしようとするデバッガは、
|
|
crt0 からリンクエディタが呼ばれた後でのみそれが可能となります。
|
|
ダイナミックリンクされているバイナリは
|
|
.Fa so_debug
|
|
構造体を持っています。この構造体の場所は
|
|
.Fa _dynamic
|
|
中の
|
|
.Fa d_debug
|
|
フィールドで指示されます。
|
|
.Bd -literal -offset indent
|
|
struct so_debug {
|
|
int dd_version;
|
|
int dd_in_debugger;
|
|
int dd_sym_loaded;
|
|
char *dd_bpt_addr;
|
|
int dd_bpt_shadow;
|
|
struct rt_symbol *dd_cc;
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Bl -tag -width dd_in_debugger
|
|
.It Fa dd_version
|
|
このインタフェースのバージョン番号。
|
|
.It Fa dd_in_debugger
|
|
当該プログラムがデバッガの制御下にあることを実行時リンカに知らせるために
|
|
デバッガによってセットされます。
|
|
.It Fa dd_sym_loaded
|
|
共有オブジェクトをロードすることで実行時リンカがシンボルを追加した場合、
|
|
実行時リンカによってセットされます。
|
|
.It Fa dd_bpt_addr
|
|
デバッガに制御を移すために実行時リンカによってセットされる
|
|
ブレークポイントアドレス。
|
|
このアドレスは、_main 呼び出しの前に、スタートアップモジュール
|
|
.Pa crt0.o
|
|
によってある適切な場所に決定されます。
|
|
.It Fa dd_bpt_shadow
|
|
アドレス
|
|
.Fa dd_bpt_addr
|
|
にあった元の機械命令を保持します。
|
|
デバッガは、プログラム実行を再開する前にこの機械命令を元に戻すことに
|
|
なっています。
|
|
.It Fa dd_cc
|
|
デバッガが必要とする可能性のある、実行時にアロケートしたシンボルの
|
|
リンクリストへのポインタ。
|
|
.El
|
|
.Pp
|
|
.Em ld_entry
|
|
構造体は
|
|
.Nm ld.so
|
|
中のサービスルーチン一式を定義します。
|
|
.\" See
|
|
.\" .Xr libdl.a
|
|
.\" for more information.
|
|
.Bd -literal -offset indent
|
|
struct ld_entry {
|
|
void *(*dlopen)(char *, int);
|
|
int (*dlclose)(void *);
|
|
void *(*dlsym)(void *, char *);
|
|
char *(*dlerror)(void);
|
|
};
|
|
.Ed
|
|
.Pp
|
|
.Fa crt_ldso
|
|
構造体は、crt0 中のスタートアップコードと
|
|
.Nm ld.so
|
|
との間のインタフェースを定義します。
|
|
.Bd -literal -offset indent
|
|
struct crt_ldso {
|
|
int crt_ba;
|
|
int crt_dzfd;
|
|
int crt_ldfd;
|
|
struct _dynamic *crt_dp;
|
|
char **crt_ep;
|
|
caddr_t crt_bp;
|
|
char *crt_prog;
|
|
char *crt_ldso;
|
|
struct ld_entry *crt_ldentry;
|
|
};
|
|
#define CRT_VERSION_SUN 1
|
|
#define CRT_VERSION_BSD_2 2
|
|
#define CRT_VERSION_BSD_3 3
|
|
#define CRT_VERSION_BSD_4 4
|
|
.Ed
|
|
.Bl -tag -width crt_dzfd
|
|
.It Fa crt_ba
|
|
crt0 によって
|
|
.Nm ld.so
|
|
がロードされた仮想アドレス。
|
|
.It Fa crt_dzfd
|
|
SunOS では、このフィールドは
|
|
.Dq Pa /dev/zero
|
|
へのオープンされたファイル記述子を保持し、
|
|
0 クリアされたデマンドページを得ます。
|
|
.Fx
|
|
ではこのフィールドは -1 を保持します。
|
|
.It Fa crt_ldfd
|
|
.Nm ld.so
|
|
をロードするために crt0 が用いる、オープンされたファイル記述子
|
|
を保持します。
|
|
.It Fa crt_dp
|
|
main の
|
|
.Fa _dynamic
|
|
構造体へのポインタ。
|
|
.It Fa crt_ep
|
|
環境文字列へのポインタ。
|
|
.It Fa crt_bp
|
|
メインプログラムがデバッガで実行される場合、
|
|
実行時リンカがブレークポイントを置くアドレス。
|
|
.Fa so_debug
|
|
を参照してください。
|
|
.It Fa crt_prog
|
|
crt0 で決定されるメインプログラムの名前 (CRT_VERSION_BSD3 のみ)。
|
|
.It Fa crt_ldso
|
|
crt0 でマップされる実行時リンカのパス (CRT_VERSION_BSD4 のみ)。
|
|
.El
|
|
.Pp
|
|
.Fa hints_header
|
|
構造体及び
|
|
.Fa hints_bucket
|
|
構造体は、通常
|
|
.Dq Pa /var/run/ld.so.hints
|
|
に置かれるライブラリヒントのレイアウトを定義します。
|
|
ライブラリヒントは、ファイルシステム中で共有オブジェクトイメージの在処を
|
|
すばやく見つけるために
|
|
.Nm ld.so
|
|
によって利用されます。
|
|
ヒントファイルの構成は
|
|
.Dq a.out
|
|
とそれほど異なりません。つまりヒントファイルは、
|
|
固定長ハッシュバケットのオフセットとサイズを決定するためのヘッダと、
|
|
共通の文字列プールを持っています。
|
|
.Bd -literal -offset indent
|
|
struct hints_header {
|
|
long hh_magic;
|
|
#define HH_MAGIC 011421044151
|
|
long hh_version;
|
|
#define LD_HINTS_VERSION_1 1
|
|
long hh_hashtab;
|
|
long hh_nbucket;
|
|
long hh_strtab;
|
|
long hh_strtab_sz;
|
|
long hh_ehints;
|
|
};
|
|
.Ed
|
|
.Bl -tag -width hh_strtab_sz
|
|
.It Fa hh_magic
|
|
ヒントファイルのマジックナンバ。
|
|
.It Fa hh_version
|
|
インタフェースのバージョン番号。
|
|
.It Fa hh_hashtab
|
|
ハッシュテーブルのオフセット。
|
|
.It Fa hh_strtab
|
|
文字列テーブルのオフセット。
|
|
.It Fa hh_strtab_sz
|
|
文字列テーブルのサイズ。
|
|
.It Fa hh_ehints
|
|
ヒントファイルで利用可能な最大オフセット。
|
|
.El
|
|
.Pp
|
|
.Bd -literal -offset indent
|
|
/*
|
|
* ヒントファイルのハッシュテーブル要素
|
|
*/
|
|
struct hints_bucket {
|
|
int hi_namex;
|
|
int hi_pathx;
|
|
int hi_dewey[MAXDEWEY];
|
|
int hi_ndewey;
|
|
#define hi_major hi_dewey[0]
|
|
#define hi_minor hi_dewey[1]
|
|
int hi_next;
|
|
};
|
|
.Ed
|
|
.Bl -tag -width hi_ndewey
|
|
.It Fa hi_namex
|
|
ライブラリを指定する文字列のインデックス。
|
|
.It Fa hi_pathx
|
|
ライブラリのフルパス名を表す文字列のインデックス。
|
|
.It Fa hi_dewey
|
|
共通ライブラリのバージョン番号。
|
|
.It Fa hi_ndewey
|
|
.Fa hi_dewey
|
|
中の有効エントリ数。
|
|
.It Fa hi_next
|
|
ハッシュ衝突の際の次のバケット。
|
|
.El
|
|
.Sh 警告
|
|
現在のところ、共有ライブラリ生成をサポートしているのは (GNU) C コンパイラ
|
|
のみです。他のプログラミング言語では利用できません。
|