LD(1) — UNIX Programmer’s Manual
名称
ld − リンクエディタ
形式
ld [ option ] ... file ...
解説
ld は、 いくつかのオブジェクトプログラムを 1つに結合し、 外部参照を解決し、 ライブラリを サーチします。 最も単純なケースでは、 いくつかのオブジェクトファイル file が指定され、 ld はそれらを結合して、 実行可能なオブジェクトモジュールまたは別の ld の実行時に入力できるオブジェクトモジュールを作ります (後者のケースでは、 再配置ビットを保存するために −r オプションを指定しなければなりません)。 ld の出力は a.out に格納されます。 ロードの最中にエラーが発生しない場合にだけ、 このファイルは実行可能になります。
引数のルーチンは、 指定された順に連結されます。 出力のエントリポイントは、 (−e オプションが指定されていない限り) 最初のルーチンの先頭になります。
ある引数がライブラリである場合、 引数の並びでその引数が見つかった時点で、 そのライブラリが 1度だけサーチされます。 未解決の外部参照を定義しているルーチンだけが、 ロードされます。 あるライブラリのルーチンが 同じライブラリにある別のルーチンを参照していて、 かつ、 そのライブラリが ranlib(1) で処理されていない場合には、 参照されるルーチンは、 参照するルーチンよりもライブラリ内であとになければなりません。 したがって、 ライブラリ内のプログラムの順序が重要になることもあり得ます。 1つのライブラリの最初のメンバは、 ‘__.SYMDEF’ という名前のファイルである必要があります。 このファイルは、 ranlib(1) を用いて作られる、 ライブラリの辞書であると認識されます。 この辞書は、 できるだけ多くの参照を満足させるために、繰り返しサーチされます。
シンボル ‘_etext’ および ‘_edata’、‘_end’ (Cでは ‘etext’ および ‘edata’、‘end’) は、 予約されていて、 使用された場合には、 それぞれプログラムの上の先頭の記憶位置、 初期化データの上の先頭の記憶位置、 および全データの上の先頭の記憶位置にセットされます。 これらのシンボルを定義することはできません。
ld では、 いくつかのオプションを使用できます。 −l 以外のオプションは、 ファイル名の前に置く必要があります。
−A このオプションは、 インクリメンタルローディングを指定します。 つまり、 結果として得られるオブジェクトが 既に実行中のプログラムに読み込まれるように、 リンクが行われます。 次の引数はファイル名で、 そこに格納されているシンボルテーブルが、 追加シンボルを定義するための基礎として解釈されます。 新たにリンクされたものだけが a.out のテキストおよびデータ部分に組み込まれますが、 新しいシンボルテーブルには、 インクリメンタルロードの前と後に定義された すべてのシンボルが反映されます。 この引数は、 引数の並びの中でも、 他のオブジェクトファイルよりも前に指定しなければなりません。 同時に −T オプションも使用することができ、 新たにリンクされるセグメントが、 対応するアドレス"(4096の倍数)" から始まるものと解釈されます。 デフォルトは _end の古い値です。
−B 次の引数は、 BSS セグメントの原点をセットする 16進数です。
−D 次の引数を 16進数として解釈し、 その指定された長さになるまでデータセグメントに値が 0 のバイトを補います。
−d −r フラグがあっても、 共用領域の定義を強制します。
−e 次の引数は、 ロードされるプログラムのエントリポイントの名前 であると解釈されます。 記憶位置 0 がデフォルトです。
−Ldir ライブラリを見つけるために サーチされるディレクトリのリストに dir を追加します。 −L で指定されたディレクトリは、 標準的なディレクトリの前にサーチされます。
−lx このオプションは、 ライブラリ名 ‘libx.a’ (ここで、 x は文字列) の短縮形です。 ld は、ライブラリを見つけるために、 まず −L オプションで指定されたディレクトリをサーチし、 次に標準的なディレクトリ ‘/lib’、‘/usr/lib’、‘/usr/sony/lib’、 ‘/usr/pds/lib’、‘/usr/local/lib’ をサーチします。 ライブラリは、 その名前が見つかった時に探されるので、 −l を置く位置が意味を持ちます。
−M ロードされるファイルの名前をリストしたプリミティブロードマップを作ります。
−N テキスト部分を読み出し専用、 すなわち共有できるようにはしません (マジック番号 0407)。
−n 出力ファイルが実行される時に、テキスト部分が、 読み出し専用でファイルを実行するすべてのユーザの 共用になるようにします (マジック番号 0410)。 この指定は、 データ領域をテキスト領域のあとの最初の 4096 バイト境界まで 移動させることになります。
−o −o の後ろの引数 name は、 a.out の代わりに使用される ld の出力ファイルの名前になります。
−r 出力ファイルが別の ld の実行で使用できるように、 再配置ビットを出力ファイル内に生成します。 また、 このフラグは、 最終的な定義が共通シンボルへ与えられるのを防止し、 診断メッセージ ‘undefined symbol’ を抑制します。
−S ローカルおよびグローバル以外のすべてのシンボルを 除去することによって出力を削ります。
−s 出力をストリップします。 つまり、 スペースを節約するために、 シンボルテーブルと再配置ビットを取り除きます (ただし、デバッガの有効性を弱めます)。 この情報は、 strip(1) を使用して除去することもできます。
−T 次の引数は、 テキストセグメントの原点をセットする 16進数です。 デフォルトの原点は 0 です。
−t 処理されるときに各ファイルの名前を表示します(トレース)。
−u 次の引数を 1つのシンボルとして解釈し、 シンボルテーブルに未定義として入れます。 当初シンボルテーブルは空であって、 最初のルーチンのローディングを強制するために未解決の参照が必要なため、 このオプションは、ライブラリから完全にローディングを 行う場合に役立ちます。
−X 名前が ‘L’ で始まっているローカルシンボル以外のローカルシンボルを セーブします。 このオプションは、 ルーチンに対してシンボルをローカルにしておき、 内部的に生成されたラベルを捨てるために、 cc(1) によって使用されます。
−x ローカル(グローバルでない)シンボルを出力のシンボルテーブルに保存しません。 外部シンボルだけをシンボルテーブルに入れます。 このオプションは、 出力ファイルのスペースをいくらか節約します。
−ysym
sym のある各ファイルについて、そのタイプと、 そのファイルがそのシンボルを定義または参照しているかどうかを示します。 多数のこのようなオプションを指定して、 多数のシンボルをトレースすることができます。 (普通は、 sym を ‘_’ で始める必要があります、 なぜなら、 C および FORTRAN、 Pascal の外部変数は下線で始まるからです。)
−z 結果として得られる実行可能なファイルをプリロードではなく デマンドロードにします (マジック番号 0413)。 これがデフォルトです。 出力ファイルには、 4096 バイトのヘッダに続いて、 サイズがそれぞれ 4096 バイトの倍数であるテキストセグメントと データセグメントが作られます。 このとき、 必要があれば、 ファイルにナルが埋め込まれます。 この形式を使用すると、 最初のいくつかの BSS セグメントシンボルが データセグメントに存在するようなります (size(1) の出力参照)。 これによって、 データセグメントのサイズのラウンドアップから生じるスペースの無駄を 防止することができます。
関連ファイル
/lib/lib∗.aライブラリ
/usr/lib/lib∗.aライブラリ
/usr/{sony,pds,local}/lib/lib∗.aライブラリ
a.out出力ファイル
関連事項
as(1), ar(1), cc(1), ranlib(1)
バグ
データをページ境界に強制配置する方法はありません。 ldは、 システムのバグを回避するために、 次のページ境界へ配置して ファイルシステムからデマンドロードされるように イメージを詰めます。
NEWS-OSRelease 3.3