| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 1 : ユーザーコマンド (A~M) > lld_pa(1)HP-UX 11i Version 2: September 2004 |
|
名称ld_pa: ld ― リンクエディタ 構文リンクエディタの共通オプションld [-bdmnqrstvxzEGIOPQVZ]
[-a search] [-c filename] [-dynamic] 32 ビット (SOM) リンクエディタのオプションld [-NST] [-A name] [-C n] [-Fl] [-Fw]
[-Fz] [+cdp oldpath:newpath] 64 ビット (ELF) リンクエディタのオプションld [-k filename] [+fini function] [+ild] [+ildnowarn]
[+ildpad percentage] [+ildrelink] [+init function] [+interp file] [+[no]allowunsats] [+[no]forceload]
[+hideallsymbols] [+nodefaultmap]
[+noenvvar] [+nodynhash] 説明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 です。 そのファイルが実行可能であり、デバッグ情報を含んでいる場合、 ld は pxdb をその出力ファイルに呼び出します。 最初のデバッグセッションまで pxdb の呼出しを延期するには、 LD_PXDB を /bin/true に設定してください。 LPATH 環境変数を使用すると、ライブラリファイルを検索するデフォルトディレクトリを指定できます。 -l オプションを参照してください。 オプション最初に ld の共通オプションを説明します。次に 32 ビットリンカでのみサポートされているオプションを説明します。最後に 64 ビットリンカでのみサポートされているオプションを説明します。
32 ビット リンクエディタ オプション
64 ビット リンクエディタ オプション
デフォルト特に指示されない限り、 ld はその出力を a.out と命名します。 -o オプションは名前を置き換えます。 実行可能出力ファイルのタイプは SHARE_MAGIC です。 -a のデフォルトの状態は、利用できれば共有ライブラリを、利用できなければアーカイブライブラリを検索することです。 デフォルトのバインド動作は deferred です。 -Z/-z オプションのデフォルト値は -Z です。 64 ビットモードでは、 デフォルトで +std がオンになります。 ld での増分リンク (64 ビットモードのみ)リンク時間は、編集、コンパイル、リンク、デバッグの開発サイクルで大きなウエートを占めます。 増分リンカ (+ild オプションと +ildrelink オプションで利用可能) は、以前のバージョンのプログラムの大半は再利用できること、未変更のオブジェクトファイルは処理が不要だということを利用して、リンク時間を短くします。 増分リンカを使用すると、未変更のオブジェクトファイルを再リンクすることなく、以前に作成した出力ファイル (実行可能ファイルまたは共有ライブラリ) にオブジェクトコードを挿入できます。 初期増分リンク後の再リンクに必要な時間は、変更したモジュールの数に従って変化します。 リンカには、次のリンクモードがあります。
一般的に、増分リンクは通常リンクよりもかなり高速です。 初回のリンクの場合、増分リンクは通常のリンク処理と同じ時間を必要としますが、以後の増分リンクは通常リンクよりもかなり高速になります。 中規模のリンク (ファイル数十個、合計数メガバイト) でオブジェクト 1 つの変更では、通常の ld リンクよりも一般的に 10 倍程度速くなります。 増分リンカは、割り当てられているパディングスペースや他の制約が許す限り、増分リンクを実行します。 リンク時間が短くなる代りに、実行可能ファイルまたは共有ライブラリのサイズが大きくなります。 増分リンカは、出力ファイルのすべての構成要素に対してパディングスペースを割り当てます。 パディングによりモジュールは、 ld でリンクされたモジュールよりも大きくなります。 以後の増分リンクでオブジェクトファイルのサイズが大きくなると、増分リンカは利用可能なパディングを使い尽くしてしまう可能性があります。 このような状態になると、リンカは警告メッセージを表示し、モジュールの初期増分リンクを完全に行います。 オブジェクトファイルが変更されると、増分リンカはリンクされる実行可能ファイルや共有ライブラリ内にあるそのファイルの内容を置き換えるだけではなく、そのオブジェクトファイル内で定義され、他のオブジェクトから参照されているすべてのシンボルへの参照も調整します。 この処理は、増分リンクされた実行可能ファイルまたは共有ライブラリに保存されている再配置レコードを参照することによって実行されます。 初期増分リンクでは、リンカは入力のオブジェクトファイルおよびライブラリを、通常リンクと同じ方法で処理します。 通常リンクの処理の他に、増分リンカはオブジェクトファイル、グローバルシンボル、および再配置についての情報を保存し、出力ファイル内に拡張用のセクションをパディングします。 以後の増分リンクでは、リンカはタイムスタンプとファイルサイズを使用してどのオブジェクトファイルが変更されたかを調べ、そのモジュールをアップデートします。 状況によっては、増分リンカは増分リンクを実行できません。 このような状態になると、増分リンカは自動的に初期増分リンクを実行し、増分リンクが可能な状態にします。 次の状況で、リンカは自動的に出力ファイルの初期増分リンクを実行します。
詳細については、 『『HP-UX リンカー & ライブラリー オンライン ユーザーズガイド』』 (ld +help) を参照してください。 アーカイブライブラリの処理 未解決のシンボルがある場合、増分リンカはアーカイブライブラリを検索します。 リンカは未解決のシンボルに対応するすべてのアーカイブメンバーを抽出し、それらのメンバーを新しいオブジェクトファイルとして処理します。 アーカイブライブラリが変更された場合、リンカは修正後のアーカイブライブラリに置き換えます。 以前のリンクでアーカイブライブラリから抽出されたオブジェクトファイルは、そのオブジェクトファイル内で定義されているシンボルへの参照がすべて削除されても、出力ロードモジュールに残ります。 リンカは、次回の初期増分リンクの実行時にこれらのオブジェクトファイルを削除します。 共有ライブラリの処理 初期増分リンクでは、リンカは共有ライブラリのシンボルテーブルを走査し、未解決のシンボルを通常のリンクと同様に解決します。 増分リンクでは、リンカは共有ライブラリおよびそのシンボルテーブルを処理せず、共有ライブラリの未解決は報告しません。 この未解決は、ダイナミックローダが実行時に検出します。 コマンド行上の共有ライブラリに変更されたものがあれば、リンカは、初期増分リンクを実行し直します。 性能 オブジェクトファイルの大半を変更した場合は、増分リンカによる性能の向上は期待できません。 小規模なプログラムでは、増分リンカでリンクの速度が改善されないことがあり、大規模なプログラムに比べ実行可能ファイルのサイズの増加率が大きくなります。 一般的には、増分リンク時であっても、未解決のシンボルを判断するために、リンカはリンク行上のすべての共有ライブラリを走査する必要があります。 この処理を実行すると、増分リンクの速度が低下することがあります。 増分リンカは共有ライブラリの走査を行わず、共有ライブラリの未解決の検出をダイナミックローダに任せます。 最終の製品モジュールを作成する場合は、増分リンカを使用しないでください。 増分リンカはパディングスペースを余分に予約するため、増分リンカで作成したモジュールは通常のリンカで作成したモジュールよりもかなり大きくなります。 注意 実行可能ファイルを変更するプログラム (strip(1) など) を使用すると、 ld が増分リンクを実行できなくなることがあります。 このような状況が発生した場合、増分リンカはメッセージを出力し、初期増分リンクを実行します。 オブジェクトファイルを処理する他社のツールを使用すると、増分リンカで作成されたモジュールに予期しない結果を引き起こすことがあります。 多言語化対応環境変数以下の多言語化対応変数は、ld の処理内容に影響します。
多言語化対応変数のいずれかの設定が不適当な場合には、ld はすべての多言語化対応変数が C に設定されているものとして動作します。 environ(5) を参照してください。 さらに、以下の環境変数は ld の処理内容に影響します。
例後で 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 \ 64 ビットでは、次のようにします。 ld ftn.o -lcl -lisamstub \ 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 +h を使用しない場合は、共有ライブラリには内部名はありません。 リンカは、 .sl がシンボリックリンクであるかどうかはチェックしません。 内部名がない場合は、リンカは自分が参照しているライブラリ名を記録します。 chatr a.out 32 ビットで、プログラムを libfunc.sl とリンクしますが、C ライブラリのアーカイブバージョンを使用します。 次の指定では、 nonfatal 修飾子とともに即時バインディングモードを指定し、冗長診断メッセージが表示されるようにします。 ld /usr/ccs/lib/crt0.o -B immediate -B nonfatal -B verbose \ 64 ビットでは、次のようにします。 ld -B immediate -B nonfatal -B verbose \ 次の指定では、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 は、コンパイル単位で使用する最大のアーキテクチャ リビジョンレベルを示します。 リンカは、上記で示したシンボルのいずれかのユーザー定義をエラーとして処理します。 そのオプションを通じて、リンクエディタにより、ユーザーには多大な柔軟性が得られます。 ただし、リンカを直接呼び出すユーザーは、何らかの責任が追加されるものとしなければなりません。 入力オプションで、プログラムの以下の特性を確実にする必要があります。
リンカがアーカイブライブラリからファイルをピックアップし、ライブラリ内の発生と同じ相対順序で最後のプログラムに入れるという保証はありません。 リンカは常に互換性の問題を検出したところに警告を出します。 その他にも、これらの問題には後から変更される機能だけでなく、アーキテクチャの問題があります。 問題には以下があります。
これらのメッセージは +vnocompatwarnings オプションを指定して使用不可にすることができます。 オプション セクションに記載したように、64 ビットリンカには、存在しないオプションがいくつかあります。次のオプションが 64 ビットリンカには、存在しません。
共有ライブラリを使用し、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" (ライブラリが見つかりません) が発生します。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||