本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 1 : ユーザーコマンド (A~M) > l

ld_pa(1)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

ld_pa: ld ― リンクエディタ

構文

リンクエディタの共通オプション

ld [-bdmnqrstvxzEGIOPQVZ] [-a search] [-c filename] [-dynamic]
[-e epsym] [-h symbol] ... [-lx | file] ... [-l: library]
[-m] [-noshared] [-o outfile] [-u symbol] ... [-y symbol] ...
[-B bind] [-D offset] [-L dir] ... [-R offset] [-Pd] [-PD file] [-PF file] [+b path_list] [+compat] [+copyobjdebug] [+df file]
[+e symbol] [+ee symbol] [+fb] [+fbu] [+gst]
[+gstsize size] [+h internal_name] [+help] [+k] [+n]
[+nocopyobjdebug] [+noobjdebug] [+objdebugonly] [+pd size]
[+pgm name] [+pi size] [+s] [+std] [+tools] [+v[no]shlibunsats]
[+vallcompatwarnings] [+v[no]compatwarnings] [+FP flag]
[+I symbol] [+O[no]fastaccess] [+O[no]procelim] [ +Oreusedir=dir ]
[+Oselectivepercent n] [+Oselectivesize size] [+OselectiveO3]
[+Ostaticprediction]

32 ビット (SOM) リンクエディタのオプション

ld [-NST] [-A name] [-C n] [-Fl] [-Fw] [-Fz] [+cdp oldpath:newpath]
[+cg pathname] [+dpv] [+filter shared_library_path]
[+gstbuckets size] [+nosmartbind] [+plabel_cache flag]

64 ビット (ELF) リンクエディタのオプション

ld [-k filename] [+fini function] [+ild] [+ildnowarn] [+ildpad percentage] [+ildrelink] [+init function] [+interp file] [+[no]allowunsats] [+[no]forceload] [+hideallsymbols] [+nodefaultmap] [+noenvvar] [+nodynhash]
[+nosectionmerge] [+paddata pagesize] [+padtext pagesize] [+pdzero]
[+stripunwind] [+vtype type]

説明

ld は、入力として単一または複数のオブジェクトファイル、またはライブラリをとり、 それらを結合して単一の (通常実行可能な) ファイルを生成します。 これを行う際に、外部シンボルへの参照の解決、 最後のアドレスのプロシージャや変数への割当て、 新しいアドレスを反映するためのコードおよびデータの修正 (「再配置」というプロセス)、 およびシンボリックデバッグ情報がファイルに存在するときには、そのアップデートを行います。 デフォルトでは、 ld は HP-UX ローダ exec() (exec(2) を参照) によって実行できる実行可能ファイルを生成します。 また、このリンカは、 ld によるこれ以降の処理に適した再配置可能なファイルを生成できます (以下の -r を参照)。 また、 共有ライブラリも生成できます (以下の -b を参照)。 シンボルが重複している場合、または未解決の外部参照が残る場合には、 リンカは出力ファイルを実行不能としてマークします。 ld は、動作中に他の何らかのエラーが発生した場合、出力ファイルを生成することもしないこともあります (+k オプションを参照)。

ld は 3 種類の入力ファイル、つまりコンパイラ、アセンブラ、またはリンカによって作成されるオブジェクトファイル (.o ファイル)、リンカによって作成される 共有ライブラリ、 およびオブジェクトファイルのアーカイブ (アーカイブライブラリという) を認識します。 アーカイブライブラリには、その構成要素オブジェクトファイルから外部的に可視のシンボルすべてのテーブルがあります。 (アーカイブコマンド ar(1) は、このインデックスを作成、保守します。) ld は、このテーブルを使用して外部シンボルへの参照を解決します。

ld は、コマンド行に表示されるのと同じ順序でファイルを処理します。 オブジェクトモジュールがユーザーのプログラム内で現在未解決の参照に定義を与える場合に限り、これには、アーカイブライブラリ要素からのコードやデータが含まれます。 コマンド行では、すべての単純なオブジェクトファイルの名前の後にライブラリをリストするのが一般的です。

共有ライブラリからのコードおよびデータは、実行可能プログラムには決してコピーされません。 プログラムが共有ライブラリを使用すると、 32 ビットリンクの ダイナミックローダ /usr/lib/dld.sl は、起動ファイル crt0.o によって起動時に呼び出されます。crt0.o のコピーが、 /usr/ccs/lib/crt0.o または /opt/langtools/lib/crt0.o ディレクトリに存在します。 64 ビットモード用のダイナミックローダは、 /usr/lib/pa20_64/dld.sl です。共有ライブラリを使用するプログラムを exec を実行して呼び出します。 crt0.o は、共有のバインドされたリンクでは必要ありません。 ダイナミックローダは、必要な各ライブラリをプロセスにアタッチし、 プログラムとそのライブラリの間のシンボリック参照をすべて解決します。 共有ライブラリのテキストセグメントは、ライブラリを使用するすべてのプロセスの間で共有されます。ライブラリを使用する各プロセスは、それらのプロセス専用のデータセグメントのコピーを受け取ります。 ライブラリをロードする実行可能プログラム上で pxdb -s on が実行されている場合、共有ライブラリのテキストセグメントは、実行可能プログラムを実行している各プロセスに対してプライベートにマッピングされます。 ld は、ld で作成されたプログラムが使用する共有ライブラリの依存関係を 再帰的に調べます。ld を実行したときに、共有ライブラリの依存関係リストに記録されている パスに存在する、サポートされている共有ライブラリが見つからない場合、 および共有ライブラリが作成されたときに -l 引き数が使用された結果存在する依存関係が見つかった場合には、ld は、あらゆるディレクトリを探して、-l (-L および LPATH を参照) で指定したライブラリを見つけます。

環境変数

引き数は、 LDOPTS 環境変数を通じて、およびコマンド行でリンカに渡すことができます。 リンカは、 LDOPTS の値を取得して、その内容をコマンド行の引き数の前に入れます。

LD_PXDB 環境変数は、デバッグプリプロセッサ pxdb に対して完全な実行パスを定義します。 デフォルト値は /opt/langtools/bin/pxdb です。 そのファイルが実行可能であり、デバッグ情報を含んでいる場合、 ldpxdb をその出力ファイルに呼び出します。 最初のデバッグセッションまで pxdb の呼出しを延期するには、 LD_PXDB/bin/true に設定してください。

LPATH 環境変数を使用すると、ライブラリファイルを検索するデフォルトディレクトリを指定できます。 -l オプションを参照してください。

オプション

最初に ld の共通オプションを説明します。次に 32 ビットリンカでのみサポートされているオプションを説明します。最後に 64 ビットリンカでのみサポートされているオプションを説明します。

-a search 

-l オプションを使って共有ライブラリを検索するか、またはアーカイブライブラリを検索するかを指定します。 search の値は、 archivesharedarchive_sharedshared_archive、 または default のどれかでなければなりません。 このオプションは、ライブラリごとの検索を制御するために、 -l オプションに対して 2 回以上使えます。 デフォルトは、ライブラリの共用バージョンが利用できれば使用し、利用できなければアーカイブバージョンを使用することです。

archive または shared のどちらかがアクティブならば、指定したライブラリタイプだけが受け付けられます。

archive_shared がアクティブな場合、アーカイブ形式が優先しますが、共有形式も認められます。

shared_archive がアクティブな場合、共有形式が優先しますが、アーカイブ形式も認められます。

-b 

通常の実行可能ファイルではなく共有ライブラリを作成します。 このオプションで処理されたオブジェクトファイルには、 position-independent code (PIC) を入れなければなりません。 cc(1), CC(1) (オプションの C++ コンパイラ ドキュメンテーションの一部), f77(1), pc(1), as(1), および 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 で PIC の説明を参照してください。

-c filename 

ファイルから ld オプションを読み込みます。 各行には、空白で区切った引き数が 0 個以上あります。 ファイル内の各行は、最後の行も含めて、改行文字で終わっていなければなりません。 # 文字は、そこから行末までコメントであることを示します。 # 文字をエスケープさせるには、シーケンス ## を使用します。

-d 

強制的に「共通」記憶領域の定義を行います。 つまり、 -r 出力に対してアドレスとサイズを割り当てます。

-e epsym 

出力ファイルのデフォルトのエントリーポイント アドレスを、シンボル epsym のエントリーポイント アドレスに設定します (このオプションは実行可能ファイルだけに適用されます)。

-h symbol 

シンボルテーブルを出力ファイルに書き出す前に、 この名前を「ローカル」としてマークして、外部的に見えなくなるようにします。 これにより、 ld による将来の処理時に、特にこのエントリーが別のファイルの定義と衝突しないようになります。

複数の symbol を指定できますが、シンボルの前に -h を付けなければなりません。 共有ライブラリまたはプログラムの構築時に使用すると、 このオプションは、指定したシンボルがダイナミックローダから見えないようになります。

-lx 

ライブラリ libx.a または libx.sl を検索します。ただし、 x は単一または複数の文字です。 -a オプションの現在の状態は、ライブラリのアーカイブ (.a) と共用 (.sl) バージョンのどちらかが検索されるかを判定します。 名前が現れた時点でライブラリが検索されるため、 -l の位置は意味があります。 デフォルトでは、32 ビットライブラリは /usr/lib および /usr/ccs/lib にあります。 64 ビットライブラリは /usr/lib/pa20_64 にあります。 環境変数 LPATH がユーザーの環境に存在する場合、 検索するディレクトリのコロンで区切ったリストを LPATH に入れなければなりません。 これらのディレクトリは、デフォルトディレクトリの代わりに検索されますが、その場合でも -L オプションは有効です。 プログラムが共有ライブラリを使用すると、32 ビット用ダイナミックローダ /usr/lib/dld.sl または 64 ビット用ダイナミックローダ /usr/lib/pa20_64/dld.sl は、リンク時に各ライブラリと同じディレクトリから各ライブラリをロードしようとします (+s および +b オプションを参照)。

-l: library 

指定したライブラリを検索します。-l オプションと類似していますが、-a オプションの現在の状態が重要でない点が異なります。 ライブラリ名には、有効なファイル名であれば任意に指定できます (注、前のリリースでは、 プレフィックス lib を入れ、.a または .sl のサフィックスで終わらなければなりませんでした)。

-m 

このオプションは標準出力上にロードマップを生成します。

-n  

このオプションは 64 ビット ld では無効ですが、それ以外には有効です。 ファイルタイプ SHARE_MAGIC の実行可能出力ファイルを生成します (デフォルト)。 このオプションには、 -N および -q との互換性はありません。

-o outfile 

-o outfile (outfile を指定しなければ a.out) という名前の出力オブジェクトファイルを生成します。

-q  

このオプションは 64 ビットリンクでは無効です。 ファイルタイプ DEMAND_MAGIC の実行可能出力ファイルを生成します。 このオプションには、 -n, -N, および -Q との互換性はありません。

-r 

次の再リンクのために、出力ファイルに再配置情報を保持します。 ld コマンドは未定義シンボルをレポートしません。 このオプションは、共有ライブラリの作成時 (-b) または -A または +ild 増分リンクオプションと一緒には使用できません。

-s 

出力ファイルからすべてのシンボルテーブル、再配置、およびデバッグサポート情報を削除します。 これにより、生成されるプログラム上でシンボリックデバッガ機能が一部、またはすべて使用できなくなることがあります。 このオプションには、 -r との互換性はありません (strip(1) コマンドもこの情報を削除します)。 このオプションは、 +ild と同時に指定することはできません。 (増分リンクは、 -s オプションで削除される出力ロードモジュールの一部を必要とします。)

-t 

ld が各入力ファイルを処理するたびに、トレースを (標準出力に) プリントします。

-u symbol 

シンボルテーブルの未定義シンボルとして symbol を入力します。 未解決の参照が生成されますが、これは、ライブラリのオブジェクトファイルだけからのプログラムをリンクする場合に便利です。 複数の symbol を指定できますが、各シンボルの前に -u を付けなければなりません。

-v 

リンク時に詳細なメッセージを表示します。 ロードされるライブラリモジュールごとに、 リンカは、どのモジュールによってそのシンボルがロードされたかを示します。

-x 

出力ファイルからローカルシンボルを削除します。 これはオブジェクトファイルユーティリティの機能を損なわずに出力ファイルのサイズを縮小します。このオプションは、-r オプションとの互換性はありません。 このオプションは、 +ild オプションと同時に指定することはできません。 (増分リンクは、 -x オプションで削除される出力ロードモジュールの一部を必要とします。)

注記: -x の使用はデバッガの使用に影響を与えることがあります。

-y symbol 

symbol が現れる各ファイルを示します。symbol は複数指定できますが、各シンボルの前に -y を付けなければなりません。

-z 

null ポインタの実行時参照が SIGSEGV シグナルを生成するようにします (これは -Z オプションの補足です)。

-B bind 

共有ライブラリを使ってプログラムの実行時バインディング動作を選択したり、 共有ライブラリの生成に必要なバインディング方法を選択します。 bind の最も一般的な値は、以下のとおりです。

deferred  

プログラム起動時ではなく最初の参照でアドレスをバインドします (デフォルト)。

immediate  

ライブラリのロード時に、すべてのシンボルのアドレスを即座にバインドします。 通常、この後に -B nonfatal を指定すると、プログラム起動時に解決できないプロシージャ呼出しを、最初の参照で解決できます。

-B nonfatal は、解決できないシンボルに関するメッセージを表示しないので、 それらのメッセージを表示するには -B verbose を指定します。

以下の例を参照してください。

nonfatal  

-B immediate も指定した場合、プログラムの起動時にバインドできなかったコードシンボルは、それらが参照されるまでバインドしないでください。 上記の -B immediate の説明を参照してください。

-B nonfatal は、解決できないシンボルに関するメッセージを表示しないので、それらのメッセージを表示するには -B verbose を指定します。

restricted  

シンボル定義の検索が、ライブラリがロードされたときの可視シンボルのみに対して行われるようにします。

symbolic  

共有ライブラリを生成するときのみに (-b オプションを指定) 使用されます。 このオプションは、可能な場合は、ライブラリ内のすべての未解決のシンボルが内部で解決されるようにします。 デフォルトでは、未解決のシンボルはライブラリの中かライブラリの外の最も近接した定義で解決されます。

verbose  

-B nonfatal を指定した場合以外には、デフォルトで、 シンボルをバインドするときに冗長メッセージを表示します。 -B nonfatal を指定した場合、メッセージを表示するには、-B verbose を明示的に指定しなければなりません。

バインディングモードの使用法についての詳細は、 +help オプションまたは 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

-D offset 

データセグメントの原点 (16 進数) を設定します。

+ild オプションと共に使用した場合、初期増分リンク後にオフセットを変更すると、リンカは自動的に初期増分リンクを実行します。

-E 

このオプションは 64 ビット ld では無効ですが、それ以外には有効です。 共有ライブラリにエクスポートするためにプログラムで定義したシンボルをすべてマークします。 デフォルトでは、 リンク時にある共有ライブラリによって、実際に参照されるシンボルだけをマークします。

-G 

出力ファイルからロード不能データをすべて削除します。 このオプションは通常、デバッグ情報の削除に使用します。

-I  

実行時にプロファイル情報を収集するコードを組み込みます。 プログラムの実行時に収集されるプロファイルデータは、 -P オプションと併用できます。 このオプションでリンクされた 32 ビットプログラムは、起動ファイル /opt/langtools/lib/icrt0.o を使用しなければなりません。このオプションは、-P, -A, -O, +ild, または +O オプションとともに使用ないでください。

-L dir 

デフォルト位置で調べる前に、 dirlibx.a または libx.sl を検索します。 複数のディレクトリを指定できますが、各ディレクトリの前には -L を付けなければなりません。 -L オプションが有効になるのは、コマンド行の -l オプションの前にある場合に限られます。

-O  

リンカ最適化をオンにします。 現在、最適化には、実行可能ファイル (32 ビットのみ) におけるコードからの不要な ADDIL 命令および不要な手順の除去が含まれます。

+O4 コンパイラオプションが選択されると、-O は、コンパイラによってリンカに渡されます。

このオプションは、 +ild オプションと併用できません。

リンカの最適化に関する詳細は、 +help オプションまたは 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

-P  

組み込まれたプログラム (-I オプションを参照) によって生成されるデータファイルを検査して、コードに対してプロファイルベースの最適化を行います。 このオプションは、 -A オプションや +ild オプションとともに使用しないでください。

-Q 

64 ビットリンクでは無効です。実行可能出力ファイルを生成します。ファイルタイプは、 -N を指定すれば EXEC_MAGIC-n を指定すれば SHARE_MAGIC になります。 このオプションはデフォルトで指定されます。 このオプションには、 -q との互換性はありません。

-R offset 

テキスト (つまりコード) セグメントの原点 (16 進数) を設定します。

+ild オプションと共に使用した場合、初期増分リンク後にオフセットを変更すると、リンカは自動的に初期増分リンクを実行します。

-V  

使用している ld のバージョンに関する情報が含まれたメッセージを出力します。

-Z  

null ポインタの実行時参照を可能にします。 cc(1)-Z および pointers の説明を参照してください (これは -z オプションの補足です)。

-Pd  

デバッグ可能な関数を並べ換えます。 通常、 -P は、 .o ファイルの関数をデバッグ情報とともに並べ換えることはありません。 並べ換えるとデバッグできなくなるためです。 このオプションはそれよりも優先され、関数を並べ換えます。

-PD filename 

-P オプションを用いてリンクした際に fdp が生成したリンクオーダー ファイルをユーザー指定ファイルに保存します。 このオプションは、 +ild オプションと一緒に使用することはできません。

-PF filename 

リンカに対して、 /usr/ccs/bin/fdp を用いてファイルを生成せず、指定されたファイルをリンカファイルとして用いるよう指示します。 このオプションには、 +ild オプションと一緒に使用することはできません。

-dynamic 

このオプションにより、リンカは共有ライブラリを使用できるプログラムを作成することができます。 64 ビットリンクでは、 +compat が使用されない限りこれがデフォルトになります。 32 ビットモードでは、リンク行に共有ライブラリがなければ、リンカは静的な実行可能ファイルを作成します。

-noshared 

このオプションは、リンカに完全にバインドされたアーカイブプログラムを強制的に作成させます。

+b path_list 

-l または -l: オプションのいずれかで指定した、 実行可能出力ファイルに必要な共有ライブラリをプログラム実行時に検索するディレクトリ (埋め込みパス) をコロンで区切ったリストで指定します。 引き数がコロン (:) だけであれば、 -L オプションおよび LPATH 環境変数 (+s オプションを参照) によって指定されるすべてのディレクトリを使って、 ld によってリストを構築する必要があることを示します。

+compat 

このオプションは、32 ビットリンクでは無視されます。 このオプションは、64 ビットリンクを 32 ビットリンクのように動作させる互換モードをオンにします。

+copyobjdebug  

objdebug スペースをコピーします。

+df file 

-P オプションと併用すると、このオプションは、file をプロファイルデータベース ファイルとして使用するように指定します。 デフォルト値は flow.data です。 FLOW_DATA 環境変数の説明を参照してください。 このオプションは、 +ild オプションと一緒に指定することはできません。

+e symbol 

共有ライブラリまたはプログラムを構築する際、 ダイナミックローダにエクスポートするシンボルをマークします。 明示的にマークしたシンボルだけが エクスポートされます。 共有ライブラリを構築する際、 エクスポートされないシンボルへの呼出しが内部解決されます。

+ee symbol 

このオプションは、シンボルをエクスポートする点で +e オプションに似ています。 しかし、 +e オプションとは異なり、 +ee はファイル内の他のどのシンボルの可視性も変更しません。 32 ビットリンクまたは +compat モードの 64 ビットリンクでは、デフォルトでエクスポートされるシンボルのどれも隠さないで指定のシンボルをエクスポートすると影響がでます。 64 ビット +std リンクでは、全シンボルがデフォルトでエクスポートされるので、 +ee はシンボルを可視にする必要がありません。 しかし、シンボルを必要と識別することによる別の副作用があり、 そのためデッドコード削除 (+Oprocelim) を使用しても除去されません。 +ee は当然、 +hideallsymbols のようなオプションが指定されたときも、エクスポートでのふるまいは同じです。

+fb 

リンカで生成された実行可能ファイル上で fastbind ツールを実行するよう、 リンカに指示します。 実行可能ファイルは共有ライブラリとリンクされます。 詳細は、 fastbind(1)+help オプション、または 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。 このオプションは、 +ild オプションと一緒に指定することはできません。

+fbu 

fastbind ツールに -u オプションを渡します。 詳細は、 fastbind(1)+help オプション、または 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。 このオプションは、 +ild オプションと一緒に指定することはできません。

+gst  

シンボルのインポート/エクスポートエントリーの値を検索するために使用する、グローバルシンボルテーブルのハッシュメカニズムを有効にします。 +gst と、これに関連するオプションを使用すると、 エクスポートされたシンボルの検索を高速化するグローバルシンボルテーブルが利用され、性能が向上します。 詳細は dld.sl(5) と 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 を参照してください。

+gstsize size 

グローバルシンボルテーブルのハッシュメカニズムに使用するハッシュ配列のサイズを指定します。 デフォルト値は 1103 です。 この値は、実行時に _HP_DLDOPTS 環境変数へ値 -symtab_size prime number を設定することで変更できます。 この値は、 chatr +gstsize size file を用いて設定できます。

+h internal_name 

共有ライブラリを作成する際に、internal_name をライブラリ名として記録します。 ライブラリが別の実行可能ファイル (プログラムまたは共有ライブラリ) をリンクするために使用される場合、 入力共有ライブラリのファイルシステムパス名の代りに、この internal_name が出力ファイルのライブラリリストに記録されます。

つまり、 +h を使用しない場合、共有ライブラリには内部名がないため、その共有ライブラリを使って実行可能ファイルを構築すると、リンカは自分が参照しているライブラリ名を記録します。

internal_name が完全に修飾されたパス名の場合、 次のリンク元の実行可能ファイルのライブラリリストに そのまま 記録されます。 internal_name が相対パス名の場合、またはディレクトリ以外の要素が指定された場合、 internal_name は、 入力共有ライブラリのファイルシステムディレクトリ部分に 付加され、 次のリンク元の実行可能ファイルのライブラリリストに記録されます。

+h オプションがリンク行に複数指定されている場合、最初のオプションが使用され、警告メッセージが表示されます。

+help  

いくつかの HP コンパイラに付属のヘルプウィンドウ ユーティリティー 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 を表示します (表示させるには、X ウィンドウシステムを実行し、かつ環境変数 DISPLAY に使用しているワークステーション名または X 端末を設定する必要があります)。 詳細は、 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

+k  

リンク中にエラーがまったく発生しなかったときだけ実行可能ファイルを作成するよう、リンカに指示します。 (システムエラーや参照未解決) エラーが発生した場合、出力ファイルは削除されます。

+n  

アーカイブライブラリや共有ライブラリを検索する前に、リンカにオブジェクトモジュールをすべてロードさせます。 それから、コマンド行で指定したアーカイブライブラリと共有ライブラリを左から右の順序で検索します。 コマンド行のライブラリの左から右への検索は、該当しないシンボルがなくなるか、 新しい定義の追加がない最後の検索になるまで繰り返されます。 このオプションは、2 つのライブラリに互いに依存するシンボルが指定された場合に有効です。

+nocopyobjdebug  

objdebug スペースをコピーしません。 このオプションをリンク行で -r オブジェクトファイルとともに使用すると、LINKMAP スペースを実行可能ファイルにコピーするデフォルトの動作を抑制できます。

+noobjdebug  

+objdebug コンパイラオプションを無効にし、すべてのデバッグ情報を実行可能ファイルにコピーします。

-g とともに使用すると、 +objdebug はリンク時に実行可能ファイルへデバッグ情報をコピーせず、オブジェクトファイル内にデバッグ情報を残します。 これにより、リンク時間が短縮され、実行可能ファイルが小さくなります。 コンパイル時のデフォルトである +noobjdebug では、デバッグ情報が実行可能ファイルにコピーされます。

コンパイル時に -g を指定すると、コンパイラはシンボリックデバッグ情報をオブジェクトファイルに置きます。 デフォルトでは、リンカは pxdb を呼び出して、このデバッグ情報を圧縮し実行可能ファイルにコピーします。 コンパイル時に +objdebug を使用すると、リンカはデバッグ情報をオブジェクトファイル内に残します。 実行可能ファイルをデバッグするには、HP WDB デバッガがオブジェクトファイルへのアクセス権を持っていなければなりません。 オブジェクトファイルを移動した場合は、HP WDB の objdir コマンドを使用して、オブジェクトファイルの位置を知らせる必要があります。 (HP DDE デバッガは、このオプションをサポートしていません。) +objdebug オプションは、デバッグ情報のコピーを行わないことにより、リンク時間を短縮し、実行可能ファイルのサイズを小さくします。

コンパイル時のデフォルトは、 +noobjdebug です。 リンカは +objdebug でコンパイルされたオブジェクトを検出すると、デバッグ情報をそれらのファイル内に残します。 +objdebug でコンパイルされていないオブジェクトファイルについては、デバッグ情報が実行可能ファイルにコピーされます。 デバッグ情報を一部のオブジェクトファイルでは残し、他のファイルでは残さないようにできます。

アーカイブメンバーが +objdebug ではコンパイルされておらず、デバッグ情報がある (-g でコンパイルされている) 場合、アーカイブメンバーのデバッグ情報は、デフォルトで a.out にコピーされます。 +objdebug+noobjdebug のどちらでコンパイルされているかに関係なく、リンカは共有ライブラリのデバッグ情報を a.out にはコピーしません。

+objdebug でコンパイルされたファイルからもデバッグ情報を実行可能ファイルにコピーするようにリンカに明示的に指示するには、 +noobjdebug オプションをリンク時に使用します。

+objdebugonly  

非 objdebug のオブジェクトやアーカイブのデバッグ情報を無視して、 +objdebug モードで実行します。 このオプションは、 C または C++ のコマンド行から、 -Wl,+objdebugonly として渡されます。 +objdebug オプションでコンパイルされたファイルだけをデバッグする場合は、 +objdebugonly を使用すると、 +noobjdebug でコンパイルされたファイルのデバッグ情報の処理をリンカが省略するため、リンク時間を短縮することができます。 +objdebugonly オプションを使用すると、リンカは pxdb の呼び出しを抑制します。

+pd size 

データ用に使用する仮想メモリのページサイズを指定します。 サポートされているサイズは 4K, 16K, 64K, 256K, 1M, 4M, 16M, 64M, 256M, D, L です。 サイズを D にすると、使用するページのサイズをカーネルが選択します。 サイズを L にすると、できるかぎり大きなページサイズが使用されます。 要求したサイズが実現できない場合、実際のページサイズは変わることがあります。

+pgm name 

-P オプションと併用すると、このオプションは、 プロファイルデータベースファイルにおけるルックアップ名として、name を使用するように指定します。 デフォルトは出力ファイルのベース名です (-o オプションによって指定されます)。 このオプションは、 +ild オプションと一緒に使用することはできません。

+pi size 

命令用に使用する仮想メモリのページサイズを指定します。 詳細は +pd オプションを参照してください。

+s  

共有ライブラリローダが環境変数 SHLIB_PATH および LD_LIBRARY_PATH (64 ビットのみ) を使用すると、 -l または -l: オプションのいずれかで指定した 実行可能出力ファイルに必要な共有ライブラリを 探し出せることを、実行時に示します。 環境変数は、ディレクトリをコロンで区切ったリストに設定する必要があります。 +s および +b を両方とも使用する場合、コマンド行の相対的な順序が、どのパスリストを最初に検索するかを示します (+b オプションを参照)。

+std 

32 ビットのリンクでは、このオプションは無視されます。 64 ビットモードでのデフォルトのスタンダードモードがオンになります。 このオプションでオンになるオプションは、 -dynamic です。 このオプションが指定された場合にオフになるか、または無視されるオプションは +compat,+noenvvar,-noshared です。

+vallcompatwarnings
  

このオプションは 64 ビット ld では無効ですが、それ以外には有効です。 互換性の問題に関する警告についての詳細を示します。 デフォルトでは、簡潔なメッセージのみ出力されます。 詳細については、後述の 警告 の項を参照してください。

+v[no]compatwarnings
  

このオプションは 64 ビット ld では無効ですが、それ以外には有効です。 システム間の互換性の問題に関する警告を出力可能 [不可] にします。 この機能の中には、将来のリリースで変更される可能性のあるものもあります。 デフォルトは +vcompatwarnings です。 詳細については、後述の 警告 の項を参照してください。

+v[no]shlibunsats
  

共有ライブラリが使用する未解決シンボルのリストのプリントが [disable] になっていた場合、プリントを可能にします。デフォルトは +vnoshlibunsats です。 リンカから報告される未解決シンボルの中には、シンボルを参照するモジュールが使用されていないために実行時に不要なものもあります。

+FP flags 

プログラム起動時に浮動小数点演算の環境をどのように初期化 するかを指定します。 デフォルトでは、動作はすべて利用不能にされます。 以下のフラグがサポートされます (大文字フラグは利用可能、 小文字フラグは利用不能を表します)。

V (v) 

無効な浮動小数点演算をトラップします。

Z (z) 

ゼロ除算をトラップします。

O (o) 

浮動小数点オーバフローをトラップします。

U (u) 

浮動小数点アンダフローをトラップします。

I (i) 

不正確な結果を生成する浮動小数点演算をトラップします。

D (d) 

非正規化値の突発的なアンダーフロー (急にゼロになります) を使用可能にします。

注記: 突発的なアンダーフローの利用可能は、 PA-RISC 1.0 ベースのシステムでは未定義の操作ですが、これは PA-RISC のこれ以降のすべてのバージョンで定義されています。 このフラグを選択すると、 実行時に使用中のプロセッサで利用できる場合に限って、突発的なアンダーフローが使用可能にされます。

実行時にこれらの設定値を動的に変更するには、 fesettrapenable(3M) を参照してください。

+I symbol 

共有ライブラリを構築する際、初期設定関数の名前を指定します。 共有ライブラリには、複数の初期設定操作を指定することもできます。 初期設定操作は、指定した順に実行されます。 複数の初期設定操作を指定できますが、それぞれの前に +I を付けなくてはなりません。 初期設定関数についての詳細は、 +help オプションまたは 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

+O[no]fastaccess 

グローバルデータへの高速アクセスを 可能 [不可] にします。リンカは、実行可能ファイル内の ADDIL 命令の数がさらに少なくなるように、データを配置し直します。

この最適化によって、データの配置に関する想定に関連した、いくつかの分かりにくいプログラミングエラーが明らかになります。 また、この最適化は、最適化レベル 2, 3 および 4 で実行されます。 デフォルトは、 最適化レベル 2 および 3 では +Onofastaccess で、 最適化レベル 4 では +Ofastaccess です。

デバッグ情報があるときに +Ofastaccess オプションを使用すると警告メッセージが生成され、デバッグ情報が破損するおそれがあります。 +Ofastaccess-g オプションは同時に使用しないでください。

このオプションは、64 ビット ld でも指定可能ですが、無視されます。

+O[no]procelim 

アプリケーションによって参照されない手順の削除が [disable] になっていた場合、 それを可能にします。デフォルトは +Onoprocelim です。 手順の削除は、レベル 0 の場合も含めて、すべての最適化レベルで実行されます。 詳細については、 +help オプションまたは 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。 このオプションは、 +ild オプションと一緒に使用することはできません。

+Oreusedir=dir 

オブジェクトコードの再利用機能のための再利用リポジトリとして使用するディレクトリの名前を指定します。 このディレクトリには、コンパイルされたオブジェクトファイルが再利用のために保存されます。 dir は、リンカを起動したディレクトリへの絶対パスまたは相対パスです。 +Oreusedir オプションを用いると、 +O4 またはプロファイルベースの最適化を使用した場合に、中間オブジェクトコードをオブジェクトコードに再コンパイルしないので、リンク時間が短縮されます。

+Oselectivepercent n
  

インライン処理のような手続き間最適化を、 オブジェクトファイルの最初の n パーセントに対して高水準で行うよう、手続き間最適化ドライバーに指示します。

+Oselectivesize size
  

手続き間最適化を、オブジェクトファイルの最初の k 個のルーチンに対して高水準で行うよう、手続き間最適化ドライバーに指示します。 k には、対象ルーチンの合計サイズが size より小さくて一番近くなる値が選ばれます。

+OselectiveO3 

+O4 のリストに含まれていないルーチンを +O3 でコンパイルするよう、手続き間最適化ドライバーに指示します。

+Ostaticprediction
  

PA 2.0 アーキテクチャでのみ使用します。 このオプションは、実行可能出力ファイルの補助ヘッダに分岐確定ビットを設定します。

32 ビット リンクエディタ オプション

-A name 

このオプションは逐次的なロードを指定します。 生成されたオブジェクトを、すでに実行中のプログラムに読み込むことができるようにリンクが編成されます。引き数 name が指定するファイルのシンボルテーブルは、追加シンボルを定義するためのベースになります。 新たにリンクされたマテリアルだけは a.out のテキストおよびデータ部分に入力されますが、 新しいシンボルテーブルは、逐次的なロードの前後に定義したすべてのシンボルを反映します。 また、 -R オプションは、 -A と同時に使用でき、 新たにリンクしたセグメントを対応するアドレスで始めることができます。 デフォルトの開始アドレスは _end の以前の値です。-A オプションには、-r および -b との互換性はありません。 また、 ld -A でコードを動的にロードするプログラムは、共有ライブラリを使用できません。 このオプションの説明については、 +help オプションまたは 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

-Cn 

最大のパラメータ照合レベルを n に設定します。 デフォルトは最大 3 です。 パラメータ照合レベルの意味については、言語マニュアルを参照してください。

-Fl  

強制的にアーカイブライブラリのすべてのメンバーオブジェクトをロードします。 -Fl を指定しない場合、リンカは必要なアーカイブメンバーだけをロードします。 このオプションは、アーカイブライブラリから共有ライブラリを作成する場合や、共有ライブラリが必要とするシンボルを定義するアーカイブメンバーをロードする場合に便利です。

-Fw  

unwind テーブルを出力しません。 コンパイラやツールが unwind テーブルを必要とする場合は、このオプションを使用しないでください。

-Fz  

$$dyncall_external への呼び出しを $$dyncall に変換するリンカ機能を無効にします。

-N 

ファイルタイプ EXEC_MAGIC の実行可能出力ファイルを生成します。 このオプションには -n および -q との互換性はありません。 このオプションにより、データはテキストの直後に入れられ、テキストは書き込み可能になります。 このタイプのファイルは共用できません。

-S  

出力ファイルに対してデフォルトの HP-UX 補助ヘッダではなく、 初期プログラムローダ (IPL) の補助ヘッダを生成します。

-T  

リンク時にメモリではなく、テンポラリファイルにロードデータ および再配置情報をセーブします。 このオプションにより、リンカの仮想記憶要件が減少します。TMPDIR 環境変数が設定されると、テンポラリファイルは、/var/tmp ではなく、指定ディレクトリで作成されます。

+cdp oldpath:newpath
  

a.out の中に記録された共有ライブラリへのパスを置き換えます。 32 ビットモードでは、 ld は、リンク時に a.out ファイル内で検索された任意の共有ライブラリの絶対パス名を記録します。 プログラムが実行を開始する時に、動的ローダは、リンク時に検索された共有ライブラリを結び付けます。 +b+s リンカオプションを使用すると、動的ローダが共有ライブラリを検索するディレクトリを指定することができますが、 動的ローダは最後の参照として、 a.out の中に記録されている絶対パスで共有ライブラリを検索します。 複数の共有ライブラリ oldpath:newpath を指定できますが、それぞれの前に +cdp オプションを付けなければなりません。

+cg pathname 

pathname が、ISOM を SOM にコンパイルするためのコードを生成するために 使用されるようにします。詳細については、 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 にあるプロファイルベース の最適化についての説明を参照してください。

+dpv  

不要な手順を取り除く目的で取り除かれた手順に関する冗長メッセージを 表示します。削除した手順のシンボル名、入力オブジェクトファイル、 およびサイズ (バイト数) が表示されます。それらの手順の全体的な サイズ (バイト数) も表示されます。

+filter shared_library_path
  

共有ライブラリフィルタ機構を使用可能にします。 この機構を使用すると、大規模なライブラリを 1 つの「フィルタ」と複数の「インプリメンテーション」ライブラリに分け、共有ライブラリを効率の良い構造にできます。 shared_library_path は、フィルタライブラリの位置を指定します。 詳細については、 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。

+gstbuckets size 

グローバルシンボルテーブルのハッシュ機構を用いて、エントリーごとに特定数のバケットを要求します。 デフォルト値は 3 です。 この値は、実行時に _HP_DLDOPTS 環境変数へ値 -symtab_buckets number を設定することで変更できます。 chatr +gstbuckets size file を用いて値を設定できます。

+nosmartbind  

共有ライブラリをバインドする際に、SmartBind を無効にします。 このオプションを有効にすると、リンカは .o ファイルをそれぞれのモジュール内に配置せず、 リンク内のすべてのシンボルを単一の SmartBind モジュールに配置します。

+plabel_cache 

plabel キャッシュ機構が有効になります。 このオプションは +gst オプションとともに使用します。

このオプションは、C++ でのみ有効です。 C++ アプリケーションでは、ダイナミックローダが PLABEL 情報 (インポートスタブ) に繰り返しアクセスする必要があります。 このアクセスを高速にするために、ダイナミックローダはグローバルシンボルテーブル構造体に PLABEL エントリーも含めるようにします。 この動作は、dl_header 構造体の PLABEL_CACHE フラグを設定すると有効になります (ld +plabel_cache enable a.out または chatr +plabel_cache enable a.out で有効になります)。

64 ビット リンクエディタ オプション

-k filename 

filename は、出力ファイルのメモリマップを記述するマップファイルを指定します。

ユーザー指定のマップファイル仕様は、 +ild オプションがあれば使用できます。 ただし、初期増分リンク後はマップファイルを変更しないでください。 初期リンク後にマップファイルを変更すると、初期増分リンクが自動的に行われます。

詳細については 『『HP-UX リンカー & ライブラリー ユーザーズガイド』』 を参照してください。 +nodefaultmap も参照してください。

+[no]allowunsats 

+allowunsats は、出力ファイルに未解決シンボルがある場合でもエラーのフラグをつけません。これは再配置可能リンクおよび共有ライブラリ生成に対するデフォルトです。 +noallowunsats は、出力ファイルに未解決シンボルがある場合はエラーのフラグをつけます。これはプログラムファイルに対するデフォルトです。

+fini function_name
  

ターミネータ関数を指定します。

+ild 

増分リンクを指定します。

出力ファイルが存在しないか、出力ファイルが +ild オプションなしで作成されている場合、リンカは初期増分リンクを実行します。 作成された出力ファイルは、以降の増分リンクで使用できます。 増分リンクオプションは、実行可能プログラムと共有ライブラリのどちらのリンクにも有効です。

次のオプションは +ild オプションと併用できますが、制限事項があります。

-D offset , -R offset
  

データセグメントおよびテキストセグメントのオリジンを設定します。 初期増分リンク後にオフセットを変更すると、リンカが初期増分リンクを自動的に実行します。

-k mapfile 

デフォルト以外のマップファイルを指定します。 +ild オプションと一緒に、ユーザー指定のマップファイル仕様を使用できます。 ただし、初期増分リンク後はマップファイルを変更しないでください。 初期リンク後にマップファイルを変更すると、初期増分リンクが自動的に行われます。

+ild と矛盾する次の ld オプションのいずれかを指定すると、リンカは警告メッセージを出力し、 +ild オプションを無視します。

-r 

再配置可能オブジェクトファイルを作成します。

削除オプション: 

-s-x は、出力ファイルからの削除を行います。 (増分リンクは、これらのオプションで削除される出力ロードモジュールの一部を必要とします。)

最適化オプション: 

-I-O-P-PD-PF+df file+fb+fbu+fbs+pgm name+Oprocelim

+ildnowarn 

増分リンクに関する警告を抑制します。 デフォルトでは、リンカは増分リンクに関連する警告をすべて出力します。 +ild+ildrelink のどちらも指定していない場合、このオプションは無視されます。

+ildpad percentage
  

増分リンカが割り当てるパディングの量を、 パディングされるオブジェクトファイル構造のサイズに対する割合 (percentage) で制御します。 デフォルトでは、リンカは 25 % のパディングスペースを割り当てます。 +ild+ildrelink のどちらも指定していない場合、このオプションは無視されます。

+ildrelink 

出力ロードモジュールの状態にかかわらず、初期増分リンクを実行します。

状況によっては (例えば、内部パディングスペースの不足)、増分リンカは初期増分リンクを強制的に実行することがあります。 +ildrelink オプションを使用して定期的に出力ファイルを再構築することにより、このような予期しない初期増分リンクが発生するのを防ぐことができます。

+init function_name
  

イニシャライザ関数を指定します。

+interp file 

dld パスを変更して、引き数を dld.sl ではなく 「インタプリタ」プログラムとして使用するようにします。

+[no]forceload 

+forceload は、アーカイブライブラリからすべてのオブジェクトファイルをロードします。 デフォルトは、 +noforceload です。アーカイブライブラリから必要なオブジェクトファイルだけをロードします。 モードは明示的に、あるいはデフォルトで選択でき、変更されるまでそのモードのままです。

+hideallsymbols 

このオプションを使用すると、 +e で明白にエクスポートされない限りシンボルのすべてがエクスポートされるのを防ぎます。

+nodefaultmap 

このオプションは、リンカがデフォルトのメモリマップを使用しないようにします。 -k リンカオプションによってマップファイルを指定する必要があります。

+nodynhash 

+gst オプションのデフォルトのリンカ動作を無効にして、 実行可能プログラムまたは共有ライブラリの .dynhash セクションを作成します。 ライブラリまたは実行可能プログラムがグローバルシンボルテーブル検索機能とともに使用されることがほとんどない場合、 または計算済みのハッシュ値を格納するためのオーバーヘッドが高すぎる場合に、 このオプションを使用して、それらの計算済みのハッシュテーブル情報が生成されないようにします。 このオプションは、 -r オプションとともに使用すると効果がなくなります。

+noenvvar 

ダイナミックローダーが実行時に LD_LIBRARY_PATH および SHLIB_PATH 環境変数を調べないようにします。これは ld +compat が指定されている場合にオンになります。 デフォルトまたは ld +std が指定されている場合は、オフになります。 +compat または +std を参照してください。 このオプションは通常、機密保護プログラム (たとえば、setuid) に使用します。

+nosectionmerge  

-r オプションとともに使用して、プロシージャが個別に配置されるようにします。 デフォルトでは、プロシージャはすべて単一のセクションにマージされます。

+paddata pagesize
  

pagesize の倍数になるように、データセグメントをゼロでパディングします。 これによりページ割り当てが改善され、TLB ミスが減ります。

+padtext pagesize
  

pagesize の倍数になるように、テキストセグメントをゼロでパディングします。 これによりページ割り当てが改善され、TLB ミスが減ります。

+pdzero 

データセグメントの先頭に、4K バイトのゼロページを生成します。 また、データセグメントのデフォルトの開始アドレスを 0x8000000000000000 とします。 このオプションを指定すると、カーネルが通常より大きいデータページを割り当てるようになり TLB ミスが減るため、性能が向上します。

+stripunwind 

unwind テーブルを出力しません。 このオプションにより、実行可能ファイルのサイズが小さくなります。 デバッグや C++ の例外処理に unwind テーブルが不要であれば、このオプションを使用してください。

+tools  

アプリケーションを、CXperf でのプロファイリング用にリンクするように要求します。

+vtype type 

リンク操作について冗長な情報を出力します。 type には、次の値があります。

files 

ロードされた各オブジェクトファイルの情報をダンプします。

heap 

リンクで使用されたヒープのサイズの情報をダンプします。

libraries 

検索されたライブラリの情報をダンプします。

procelim 

+Oprocelim オプションで拒否されたセクションの情報をダンプします。

sections 

出力ファイルに追加された各入力セクションの情報をダンプします。

symbols 

入力ファイルに定義された、または入力ファイルから参照されたグローバルシンボルの情報をダンプします。

all 

上記の情報をすべてダンプします。 -v と同じです。

デフォルト

特に指示されない限り、 ld はその出力を a.out と命名します。 -o オプションは名前を置き換えます。 実行可能出力ファイルのタイプは SHARE_MAGIC です。 -a のデフォルトの状態は、利用できれば共有ライブラリを、利用できなければアーカイブライブラリを検索することです。 デフォルトのバインド動作は deferred です。

-Z/-z オプションのデフォルト値は -Z です。

64 ビットモードでは、 デフォルトで +std がオンになります。

ld での増分リンク (64 ビットモードのみ)

リンク時間は、編集、コンパイル、リンク、デバッグの開発サイクルで大きなウエートを占めます。 増分リンカ (+ild オプションと +ildrelink オプションで利用可能) は、以前のバージョンのプログラムの大半は再利用できること、未変更のオブジェクトファイルは処理が不要だということを利用して、リンク時間を短くします。 増分リンカを使用すると、未変更のオブジェクトファイルを再リンクすることなく、以前に作成した出力ファイル (実行可能ファイルまたは共有ライブラリ) にオブジェクトコードを挿入できます。 初期増分リンク後の再リンクに必要な時間は、変更したモジュールの数に従って変化します。

リンカには、次のリンクモードがあります。

  • 通常リンク: リンカがすべてのモジュールをリンクする、デフォルトの動作モード。

  • 初期増分リンク: 増分リンクを要求したときに、増分リンカが作成した出力モジュールが存在しないか、存在しても増分リンカが増分アップデートを実行できない場合に開始されるモード。

  • 増分リンク: 増分リンクを要求したときに、増分リンカが作成した出力モジュールが存在し、増分リンカが初期増分リンクを必要としない場合に開始されるモード。

一般的に、増分リンクは通常リンクよりもかなり高速です。 初回のリンクの場合、増分リンクは通常のリンク処理と同じ時間を必要としますが、以後の増分リンクは通常リンクよりもかなり高速になります。 中規模のリンク (ファイル数十個、合計数メガバイト) でオブジェクト 1 つの変更では、通常の ld リンクよりも一般的に 10 倍程度速くなります。 増分リンカは、割り当てられているパディングスペースや他の制約が許す限り、増分リンクを実行します。 リンク時間が短くなる代りに、実行可能ファイルまたは共有ライブラリのサイズが大きくなります。

増分リンカは、出力ファイルのすべての構成要素に対してパディングスペースを割り当てます。 パディングによりモジュールは、 ld でリンクされたモジュールよりも大きくなります。 以後の増分リンクでオブジェクトファイルのサイズが大きくなると、増分リンカは利用可能なパディングを使い尽くしてしまう可能性があります。 このような状態になると、リンカは警告メッセージを表示し、モジュールの初期増分リンクを完全に行います。 オブジェクトファイルが変更されると、増分リンカはリンクされる実行可能ファイルや共有ライブラリ内にあるそのファイルの内容を置き換えるだけではなく、そのオブジェクトファイル内で定義され、他のオブジェクトから参照されているすべてのシンボルへの参照も調整します。 この処理は、増分リンクされた実行可能ファイルまたは共有ライブラリに保存されている再配置レコードを参照することによって実行されます。

初期増分リンクでは、リンカは入力のオブジェクトファイルおよびライブラリを、通常リンクと同じ方法で処理します。 通常リンクの処理の他に、増分リンカはオブジェクトファイル、グローバルシンボル、および再配置についての情報を保存し、出力ファイル内に拡張用のセクションをパディングします。 以後の増分リンクでは、リンカはタイムスタンプとファイルサイズを使用してどのオブジェクトファイルが変更されたかを調べ、そのモジュールをアップデートします。

状況によっては、増分リンカは増分リンクを実行できません。 このような状態になると、増分リンカは自動的に初期増分リンクを実行し、増分リンクが可能な状態にします。 次の状況で、リンカは自動的に出力ファイルの初期増分リンクを実行します。

  • リンカのコマンド行が変更された場合。つまり、リンカのコマンド行が出力ファイルに格納されているコマンド行と異なる場合 (冗長オプションとトレースオプションを除く)。

  • いずれかのパディングスペースを使い尽くした場合。

  • モジュールが、 ld -s オプションまたは ld -x オプションで、またはツール (strip(1) など) で変更された場合。 増分リンクは、これらのオプションで削除された出力ロードモジュールの一部を必要とします。

  • 増分リンカのバージョンに互換性がない場合。つまり、古いバージョンのリンカで作成された実行可能ファイルに対して新しいバージョンの増分リンカを実行した場合。

  • 作業ディレクトリが新しい場合。現在のディレクトリを変更すると、増分リンカは初期増分リンクを実行します。

  • アーカイブまたは共有ライブラリがリンカコマンド行に追加されたり、リンカコマンド行から削除された場合。

  • オブジェクトがリンカコマンド行に追加されたり、リンカコマンド行から削除された場合。

詳細については、 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 (ld +help) を参照してください。

アーカイブライブラリの処理

未解決のシンボルがある場合、増分リンカはアーカイブライブラリを検索します。 リンカは未解決のシンボルに対応するすべてのアーカイブメンバーを抽出し、それらのメンバーを新しいオブジェクトファイルとして処理します。 アーカイブライブラリが変更された場合、リンカは修正後のアーカイブライブラリに置き換えます。

以前のリンクでアーカイブライブラリから抽出されたオブジェクトファイルは、そのオブジェクトファイル内で定義されているシンボルへの参照がすべて削除されても、出力ロードモジュールに残ります。 リンカは、次回の初期増分リンクの実行時にこれらのオブジェクトファイルを削除します。

共有ライブラリの処理

初期増分リンクでは、リンカは共有ライブラリのシンボルテーブルを走査し、未解決のシンボルを通常のリンクと同様に解決します。 増分リンクでは、リンカは共有ライブラリおよびそのシンボルテーブルを処理せず、共有ライブラリの未解決は報告しません。 この未解決は、ダイナミックローダが実行時に検出します。 コマンド行上の共有ライブラリに変更されたものがあれば、リンカは、初期増分リンクを実行し直します。

性能

オブジェクトファイルの大半を変更した場合は、増分リンカによる性能の向上は期待できません。

小規模なプログラムでは、増分リンカでリンクの速度が改善されないことがあり、大規模なプログラムに比べ実行可能ファイルのサイズの増加率が大きくなります。

一般的には、増分リンク時であっても、未解決のシンボルを判断するために、リンカはリンク行上のすべての共有ライブラリを走査する必要があります。 この処理を実行すると、増分リンクの速度が低下することがあります。 増分リンカは共有ライブラリの走査を行わず、共有ライブラリの未解決の検出をダイナミックローダに任せます。

最終の製品モジュールを作成する場合は、増分リンカを使用しないでください。 増分リンカはパディングスペースを余分に予約するため、増分リンカで作成したモジュールは通常のリンカで作成したモジュールよりもかなり大きくなります。

注意

実行可能ファイルを変更するプログラム (strip(1) など) を使用すると、 ld が増分リンクを実行できなくなることがあります。 このような状況が発生した場合、増分リンカはメッセージを出力し、初期増分リンクを実行します。

オブジェクトファイルを処理する他社のツールを使用すると、増分リンカで作成されたモジュールに予期しない結果を引き起こすことがあります。

多言語化対応

環境変数

以下の多言語化対応変数は、ld の処理内容に影響します。

FLOW_DATA  

設定した実行可能プログラム (-I オプションを参照) は、 現在のディレクトリの flow.data というデータベースファイルにプロファイルデータを書き出します。 このファイルの名前と保存先の指定は、 FLOW_DATA に目的のパス名を設定して行います。 プロファイルデータは、実行時に指定した実行可能ファイルの basename と同じ参照名でデータベースファイルに保存されます。 単一の flow.data ファイルは、複数のプログラムファイルのプロファイルデータを保持できます。

LANG  

LC_ALL および他の LC_* 環境変数が指定されていない場合に、 母国語のロケールカテゴリ、ローカルカスタム、およびコード文字セットを定義します。LANG が指定されていない場合、または空文字列が指定されている場合、デフォルトの C (lang(5) を参照) が LANG の代わりに使用されます。

LC_ALL  

すべてのロケールカテゴリの値を定義し、LANG および他の LC_* 環境変数よりも優先的に使用されます。

LC_MESSAGES  

フォーマット、および標準エラーに書き込まれる診断メッセージの内容を 変更するために使用するロケールを定義します。

LC_NUMERIC  

数値フォーマティングのためのロケールカテゴリを定義します。

LC_CTYPE  

文字操作関数のローカルカテゴリを定義します。

NLSPATH  

LC_MESSAGES の処理を行うために、メッセージカタログの位置を定義します。

多言語化対応変数のいずれかの設定が不適当な場合には、ld はすべての多言語化対応変数が C に設定されているものとして動作します。 environ(5) を参照してください。

さらに、以下の環境変数は ld の処理内容に影響します。

TMPDIR  

一時ファイル (tmpnam(3S) を参照) 用のディレクトリを指定します。

診断

ld は、リンクが正常終了すると 0 を戻します。 0 以外のリターンコードは、エラーが発生したことを示します。

後で ld によって処理するための、プログラムのリンク部分。 (出力オブジェクトファイルの .o サフィックスに注意してください。これは、 リンク可能なオブジェクトファイルを示すための HP-UX のきまりです)。

ld -r file1.o file2.o -o prog.o 

32 ビットで、シンボリックデバッガ dde (dde(1) を参照) で使用するために、簡単な FORTRAN プログラムをリンクします。 コマンド行に -o オプションがないため、出力ファイル名は a.out です。

ld /usr/ccs/lib/crt0.o ftn.o -lcl -lisamstub \ 
     -lc /opt/langtools/lib/end.o 

64 ビットでは、次のようにします。

ld ftn.o -lcl -lisamstub \ 
     -lc /opt/langtools/lib/pa20_64/end.o 

64 ビットで、標準モードで共有のバインドされたプログラムをリンクします。 crt0.o は、共有リンクにおいてはもはや必要ないので、 指定しないことに注意してください。

ld himom.o +std -lc 

64 ビットで、互換モードプログラムをリンクします。 crt0.o は、アーカイブリンクのため含まれています。

ld /opt/langtools/lib/pa20_64/crt0.o himom.o +compat -a archive -lc 

次の指定では、共有ライブラリを作成します。

ld -b -o libfunc.sl func1.o func2.o func3.o 

次の指定では、内部名称が付けられた共有ライブラリが作成されます。

ld -b -o libfoo1.1 foo1.o foo2.o +h libfoo1.1 
ln -s libfoo1.1 libfoo1.sl 
cc -g mytest.c -L. -lfoo1 
chatr a.out 
... 
  shared library list:
    dynamic   ./libfoo1.1

+h を使用しない場合は、共有ライブラリには内部名はありません。 リンカは、 .sl がシンボリックリンクであるかどうかはチェックしません。 内部名がない場合は、リンカは自分が参照しているライブラリ名を記録します。

chatr a.out 
... 
  shared library list:
    dynamic   ./libfoo1.sl

32 ビットで、プログラムを libfunc.sl とリンクしますが、C ライブラリのアーカイブバージョンを使用します。 次の指定では、 nonfatal 修飾子とともに即時バインディングモードを指定し、冗長診断メッセージが表示されるようにします。

ld /usr/ccs/lib/crt0.o -B immediate -B nonfatal -B verbose \ 
     program.o -L . -lfunc -a archive -lc 

64 ビットでは、次のようにします。

ld -B immediate -B nonfatal -B verbose \ 
     program.o -L . -lfunc -a archive -lc 

次の指定では、32 ビットで Pascal プログラムをリンクします。

ld /usr/ccs/lib/crt0.o main.o -lcl -lm -lc 

上記の例では、/usr/ccs/lib/crt0.o の代わりに /opt/langtools/lib/crt0.o と指定することもできます。

警告

ld は、いくつかの名前を特殊な意味があるものとして認識します。 _end シンボル は、プログラムのアドレス空間の終端を超える最初のアドレスを参照するために予約されています。また _edata シンボルは、初期化データを超える最初のアドレスを参照し、 _etext シンボルはプログラムテキストを超える最初のアドレスを参照します。 シンボル end, edata, etext もリンカによって定義されますが、 プログラムの内容がこれらのシンボルへの参照であり、定義しない場合に限ります (詳細については、 end(3C) を参照)。 32 ビットで、 シンボル __tdsize は、プログラムまたは共有ライブラリで要求されるスレッドのローカル記憶領域の合計サイズを示します。

64 ビットでは、リンカはさらにいくつかのシンボルを定義しています。 シンボル __TLS_SIZE は、スレッドのローカル記憶領域の合計サイズを示します。 シンボル _FPU_STATUS は、FPU ステータスレジスタの初期ステータスを示します。 シンボル __SYSTEM_ID は、コンパイル単位で使用する最大のアーキテクチャ リビジョンレベルを示します。

リンカは、上記で示したシンボルのいずれかのユーザー定義をエラーとして処理します。

そのオプションを通じて、リンクエディタにより、ユーザーには多大な柔軟性が得られます。 ただし、リンカを直接呼び出すユーザーは、何らかの責任が追加されるものとしなければなりません。 入力オプションで、プログラムの以下の特性を確実にする必要があります。

  • リンクエディタが cc(1) を通じて呼び出されると、 起動ルーチンがユーザーのプログラムとリンクされます。 このルーチンは、メインプログラムの実行後に exit(2) を呼び出します。 ユーザーが ld を直接呼び出す場合、プログラムがエントリールーチンの終端を通過せず、常に exit() を呼び出すようにしてください。

  • シンボリックデバッガ dde で使用するためにリンクする際、プログラムには main というルーチンが必要です。 また、ユーザーは、コマンド行上で最後に指定したファイルとして 32 ビットにはファイル /opt/langtools/lib/end.o を、 64 ビットにはファイル /opt/langtools/lib/pa20_64/end.o をリンクしなければなりません。

リンカがアーカイブライブラリからファイルをピックアップし、ライブラリ内の発生と同じ相対順序で最後のプログラムに入れるという保証はありません。

リンカは常に互換性の問題を検出したところに警告を出します。 その他にも、これらの問題には後から変更される機能だけでなく、アーキテクチャの問題があります。 問題には以下があります。

  • PA 2.0 オブジェクトファイルをリンクします。 これは、PA 1.x システム上では動作しません。

  • -A オプションで増分ロードします。

  • プロシージャ呼び出しのパラメータとリターンタイプをチェックします。 これには -C オプションも含まれます。

  • 同じ名前で異なる型 (例えば、CODE や DATA) のシンボルがあります。

  • ときどきアーカイブライブラリから特定のオブジェクトファイルをスキップする リンカが、該当しないシンボルをチェックします。 この警告は、 -v オプションも指定した場合のみに出されます。

  • 共有ライブラリ内のオブジェクトのバージョンになります。

これらのメッセージは +vnocompatwarnings オプションを指定して使用不可にすることができます。

オプション セクションに記載したように、64 ビットリンカには、存在しないオプションがいくつかあります。次のオプションが 64 ビットリンカには、存在しません。

  • -q

  • -A

  • -C

  • -E

  • -Q

  • -S

  • -T

  • -X

  • +dpv

共有ライブラリを使用し、S ビットが設定されて (+s により設定される) 構築されている、64 ビットモードの実行可能プログラムには、制限事項がいくつかあります。 64 ビットの実行可能プログラムの動作は、同等の 32 ビット実行可能プログラムや、 +compat で構築された実行可能プログラムの動作とは一致しません。 setuid プログラムや setgid プログラムの場合、32 ビットモードと 64 ビットモードでは環境変数 SHLIB_PATH、 64 ビットモードでは環境変数 LD_LIBRARY_PATH による、 dld のダイナミックライブラリ検索が無効になります。 ライブラリが SHLIB_PATH (または LD_LIBRARY_PATH) で指定されたディレクトリだけに存在する場合、プログラムが setuid プログラム (つまり、uid が euid と等しくないか、gid が eguid と等しくない) であり、そのプログラムがライブラリに依存していると、"library not found" (ライブラリが見つかりません) という実行時エラーが発生します。 dld は、 getuid () == geteuid () && getgid () == getegid () という条件が満たされている場合だけ、 SHLIB_PATH によるダイナミックパス検索を使用します。 つまり、uid または gid がその実効 ID と一致しない場合、 dld は記録されているライブラリパスだけを検索します。 この結果、dld は SHLIB_PATH をチェックせず、実行時エラー "library not found" (ライブラリが見つかりません) が発生します。

著者

ld は AT&T、カリフォルニア大学バークレー校、HP で開発されました。

ファイル

/usr/lib/lib*  

32 ビットのシステムアーカイブおよび共有ライブラリ

/usr/lib/pa20_64/lib*
  

64 ビットのシステムアーカイブおよび共有ライブラリ

/usr/ccs/lib*