このマニュアルは、Solaris リンカーと実行時リンカーに加え、これらが動作するオブジェクトについて説明しています。Solaris リンカーの基本的な動作には、オブジェクトの結合が含まれます。あるオブジェクト内のシンボル参照を別のオブジェクト内のシンボル定義に接続します。この動作は、通常、結合と呼ばれます。
このマニュアルは次の領域を扱っています。
リンカー ld(1) は 1 つまたは複数の入力ファイルのデータを連結および解釈します。入力ファイルは、再配置可能オブジェクト、共有オブジェクト、またはアーカイブライブラリです。これら入力ファイルから 1 つの出力ファイルが作成されます。出力ファイルは、再配置可能オブジェクト、実行可能アプリケーション、または共有オブジェクトです。リンカーは通常、コンパイル環境の一環として呼び出されます。
実行時リンカー ld.so.1(1) は、実行時に動的実行可能ファイルと共有オブジェクトを処理し、これらを結合して実行可能なプロセスを作成します。
共有オブジェクトとは、リンク編集フェーズからの出力の書式の 1 つです。共有オブジェクトを「共有ライブラリ」と呼ぶこともあります。共有オブジェクトは、強力で柔軟な実行時環境を作成する上で重要です。
これらの領域は、それぞれのトピックに分割できますが、重複する部分も多数あります。このマニュアルでは、相互に参照させながら、各領域について説明しています。
リンク編集では、一般に、コンパイラ、アセンブラ、または ld(1) によって生成された入力ファイルを受け取ります。リンカーは、これら入力ファイル内のデータを連結および解釈して、1 つの出力ファイルを生成します。リンカーにはさまざまなオプションを使用できますが、出力ファイル (入力再配置可能オブジェクトの連結) は次のいずれかの形式になります。
静的実行可能ファイル - すべてのシンボル参照が実行可能ファイルに結合され、実行待機中のプロセスを表現する入力再配置可能オブジェクトの連結。
動的実行可能ファイル - 実行可能プロセスを生成するときに、実行時リンカーによる割り込みを必要とする入力再配置可能オブジェクトの連結。動的実行可能ファイルのシンボル参照は、実行時に結合される必要があり、また、動的実行可能ファイルには、共有オブジェクトの形式で 1 つ以上の依存関係を割り当てることができる。
共有オブジェクト - 実行時に動的実行可能ファイルに結合される機能を提供する入力再配置可能オブジェクトの連結。また、共有オブジェクトの中にも、他の共有オブジェクトに依存する依存関係がある場合もある。
これらの出力ファイルと、出力ファイルを作成する場合に使用するキーリンカーオプションを、図 1–1 に示します。
「動的実行可能ファイル」と「共有オブジェクト」を、しばしばまとめて「動的オブジェクト」と呼びます。このマニュアルでは、この動的オブジェクトに焦点を当てて説明します。
実行時リンクには、通常、過去のリンク編集から生成された 1 つまたは複数のオブジェクトの結び付けが組み込まれ、実行可能プロセスを生成します。リンカーによるこれらのオブジェクトの生成中に、結び付けの必要条件が検証され、該当する登録情報が各オブジェクトに追加され、実行時リンカーの読み込み、再配置、結合プロセスの完了が可能になります。
プロセスの実行中に、実行時リンカーの機能も使用可能になり、この機能を使用すると、要求に応じて追加共有オブジェクトを追加して、プロセスのアドレススペースを拡張できます。実行時リンクに組み込まれたコンポーネントのうち、最も一般的なのは、「動的実行可能ファイル」と「共有オブジェクト」の 2 つです。
動的実行可能ファイルとは、実行時リンカーの制御下で実行されるアプリケーションのことです。これらのアプリケーションは、通常、共有オブジェクト形式の依存関係を持ち、これらは、実行時リンカーによって配置および結合されて、実行可能プロセスが作成されます。動的実行可能ファイルは、リンカーによって生成されるデフォルトの出力ファイルになります。
共有オブジェクトは、動的にリンクされたシステムに対し、キー構築ブロックを提供します。共有オブジェクトは動的実行可能ファイルに類似していますが、 共有オブジェクトには、仮想アドレスが割り当てられていません。
動的実行可能ファイルは、通常、1 つまたは複数の共有オブジェクトに依存する依存関係を持ちます。つまり、共有オブジェクトは、動的実行可能ファイルに結合され、実行可能プロセスを作成する必要があります。共有オブジェクトは多くのアプリケーションで使用できるため、その構造上の観点は、共有性、バージョン管理およびパフォーマンスに直接影響します。
共有オブジェクトが使用する「環境」を参照することにより、リンカーまたは実行時リンカーのいずれかによって共有オブジェクトの処理を識別することができます。
共有オブジェクトは、リンカーによって処理され、動的実行可能ファイルまたは他の共有オブジェクトを生成します。共有オブジェクトは、生成される出力ファイルの依存関係になります。
動的リンクとは、通常、実行可能プロセスを生成する際に、動的実行可能ファイルと共有オブジェクトの実行時リンクとともに、これらのオブジェクトを生成するリンク編集プロセスの一部分を受け入れる場合に使用する用語です。動的リンクを使用すると、実行時にアプリケーションを共有オブジェクトへ結合できるようにすることによって、共有オブジェクトが提供するコードを複数のアプリケーションで使用できます。
標準ライブラリのサービスからアプリケーションを切り離すことにより、動的リンクも、アプリケーションの移植性および拡張性を向上させることができます。サービスのインタフェースと実装が独立しているため、アプリケーションの安定性を維持しながら、システムを更新することができます。動的リンクは、ABI (アプリケーションバイナリインタフェース) を利用するときに必要で、Solaris アプリケーションに適したコンパイル方式です。
システムコンポーネントとアプリケーションコンポーネントの間に定義されたバイナリインタフェースを利用すれば、これらのコンポーネントを非同期的に更新することができます。 Solaris リンカーは、これらのインタフェース上で稼動し、実行できるようにアプリケーションを組み合わせます。Solaris リンカーによって処理されたコンポーネントにはすべて、バイナリインタフェースが連結されますが、Solaris システムが提供するバイナリインタフェースは、「Solaris ABI」と呼ばれます。
Solaris ABI は、「System V アプリケーションバイナリインタフェース」によって始まった ABI の成果の技術的な子孫で、「SPARC Compliance Definition (SCD)」と呼ばれる、SPARC International, Inc.® が SPARC® プロセッサ向けに作成した後継成果です。
リンカーは 32 ビットのオブジェクト上で動作し、SPARCV9 システム上では 64 ビットのオブジェクト上でも動作します。SPARC システムでは、64 ビットリンカー (ld(1)) は 32 ビットのオブジェクトを生成でき、32 ビットリンカーは 64 ビットのオブジェクトを生成できます。32 ビットのリンカーでは 64 ビットオブジェクトのサイズは、.bss を除いて、2G バイトに制限されます。
32 ビットおよび 64 ビットのリンク編集を行うときに、コマンド行オプションの違いはありません。リンカーの操作モードは、コマンド行に最初に指定した入力再配置可能オブジェクトファイルの、ELF クラスによって制御されます。mapfile やアーカイブライブラリのみからのリンクなどの、特別なリンク編集では、それらの入力ファイルの影響を受けず、デフォルトで 32 ビットモードになります。これらのケースでは、-64 オプションで 64 ビットのリンク編集を行うことができます。32 ビットオブジェクトと 64 ビットオブジェクトを混在させることはできません。
32 ビットオブジェクト上および 64 ビットオブジェクト上のリンカーの操作に違いはありません。このマニュアルでは、多くの場合、32 ビットオブジェクトでの操作の例を使用します。64 ビットの処理が 32 ビットの処理と異なる場合には説明します。
64 ビットアプリケーションについては、『Solaris 64 ビット 開発ガイド』を参照してください。
リンカーは、LD_ で始まる環境変数 (LD_LIBRARY_PATH
など) を多数サポートします。 これらの環境変数は、この汎用形式でも使用できますが、_32 または _64 を接尾辞として指定することもできます (LD_LIBRARY_PATH_64
など)。 この接尾辞は、環境変数をそれぞれ 32 ビットまたは 64 ビットプロセス固有のものにします。またこの接尾辞は、接尾辞の付いていない汎用形式の環境変数に優先します。
このマニュアルでは、リンカーの環境変数を記述する場合は、接尾辞の付いていない汎用形式を使用します。サポートされている環境変数の一覧は、ld(1) と ld.so.1(1) のマニュアルページを参照してください。
Solaris オペレーティング環境では、いくつかのサポートツールとライブラリも提供しています。これらのツールを使用すると、これらのオブジェクトとリンク処理の分析や検査が行えます。このようなツールとして、elfdump(1)、nm(1)、 dump(1)、ldd(1)、pvs(1)、elf(3ELF) と、リンカーデバッグのサポートライブラリがあります。これらのツールについては、例を使用して詳しく説明します。