このマニュアルは、Solaris OS リンカーと実行時リンカーの動作に加え、これらが動作するオブジェクトについて説明しています。Solaris OS リンカーの基本的な動作には、オブジェクトの結合が含まれます。この結合によって、接続されるオブジェクトから別のオブジェクト内のシンボル定義へシンボル参照されるようになります。
このマニュアルは次の領域を扱っています。
リンカー ld(1) は、1 つまたは複数の入力ファイルのデータを連結および解釈します。入力ファイルは、再配置可能オブジェクト、共有オブジェクト、またはアーカイブライブラリです。これら入力ファイルから 1 つの出力ファイルが作成されます。出力ファイルは、再配置可能オブジェクト、実行可能アプリケーション、または共有オブジェクトです。リンカーは通常、コンパイル環境の一環として呼び出されます。
実行時リンカー ld.so.1(1) は、動的実行可能ファイルと共有オブジェクトを実行時に処理し、実行可能ファイルと共有オブジェクトを結合して、実行可能プロセスを作成します。
共有オブジェクトとは、リンク編集フェーズからの出力の形式の 1 つです。共有オブジェクトを「共有ライブラリ」と呼ぶこともあります。共有オブジェクトは、強力で柔軟な実行時環境を作成する上で重要です。
Solaris OS リンカーは、実行可能かつリンク可能なフォーマット (executable and linking format、ELF) に準拠したファイルを処理します。
これらの領域は、それぞれのトピックに分割できますが、重複する部分も多数あります。このマニュアルでは、相互に参照させながら、各領域について説明しています。
リンク編集では、一般に、コンパイラ、アセンブラ、または ld(1) によって生成されたさまざまな入力ファイルを受け取ります。リンカーは、これら入力ファイル内のデータを連結および解釈して、1 つの出力ファイルを生成します。リンカーにはさまざまなオプションを使用できますが、出力ファイル (入力再配置可能オブジェクトの連結) は次のいずれかの形式になります。
「静的実行可能ファイル」– すべてのシンボル参照を解決する入力再配置可能オブジェクトの連結。この実行可能ファイルは、実行準備が整ったプロセスを表します。「静的実行可能ファイル」を参照してください。
「動的実行可能ファイル」– 実行可能プロセスを生成するときに、実行時リンカーによる割り込みを必要とする入力再配置可能オブジェクトの連結。動的実行可能ファイルには、実行時に結合されるシンボル参照も必要です。動的実行可能ファイルは、通常共有オブジェクトの形で 1 つ以上の依存関係を持っています。
「共有オブジェクト」– 実行時に動的実行可能ファイルに結合される可能性があるサービスを提供する入力再配置可能オブジェクトの連結。また、共有オブジェクトの中にも、ほかの共有オブジェクトに依存する依存関係がある場合もあります。
これらの出力ファイルと、出力ファイルを作成する場合に使用するキーリンカーオプションを、図 1–1 に示します。
「動的実行可能ファイル」と「共有オブジェクト」を、しばしばまとめて「動的オブジェクト」と呼びます。このマニュアルでは、この動的オブジェクトに焦点を当てて説明します。
静的実行可能ファイルは、多くのリリースで作成しないように勧められています。実際、64 ビットシステムアーカイブライブラリが提供されたことはありません。静的実行可能ファイルは、システムアーカイブライブラリに反して構築されるので、実行可能ファイルにはシステム実装の詳細が含まれます。この自己内包には、多数の欠点があります。
この実行可能ファイルは、共有オブジェクトとして提供されるシステムパッチの恩恵を受けることができません。したがって、多くのシステムの改良を利用するには、この実行可能ファイルを再構築する必要があります。
将来のリリースでこの実行可能ファイルを実行できなくなる可能性があります。
システム実装の詳細を複製すると、システムのパフォーマンスに悪影響を与えます。
Solaris 10 リリースでは、32 ビットシステムアーカイブライブラリは提供されません。これらのライブラリ (特に libc.a) が提供されないため、特別なシステムに関する知識を持っていないかぎり、静的実行可能ファイルは作成できなくなりました。なお、リンカーの静的リンクオプションを処理する機能とアーカイブライブラリの処理に変更はありません。
実行時リンクには、通常、過去のリンク編集から生成された 1 つまたは複数のオブジェクトの結び付けが組み込まれ、実行可能プロセスを生成します。リンカーによってこれらのオブジェクトが生成されている間、確認済みの結合要件を表す適切な記帳情報が生成されます。この情報によって、実行時リンカーは読み込み、再配置し、結合プロセスを完了できます。
プロセス実行中、実行時リンカーの機能が使用できるようになります。これらの機能は、必要に応じて共有オブジェクトを追加することによって、プロセスのアドレス領域を拡張するために使用できます。実行時リンクに組み込まれたコンポーネントのうち、もっとも一般的なのは、「動的実行可能ファイル」と「共有オブジェクト」の 2 つです。
動的実行可能ファイルとは、実行時リンカーの制御下で実行されるアプリケーションのことです。これらのアプリケーションは、通常、共有オブジェクト形式の依存関係を持ち、これらは、実行時リンカーによって配置および結合されて、実行可能プロセスが作成されます。動的実行可能ファイルは、リンカーによって生成されるデフォルトの出力ファイルになります。
共有オブジェクトは、動的にリンクされたシステムに対し、キー構築ブロックを提供します。共有オブジェクトは動的実行可能ファイルに類似していますが、共有オブジェクトには、仮想アドレスが割り当てられていません。
動的実行可能ファイルは、通常、1 つまたは複数の共有オブジェクトに依存する依存関係を持ちます。一般的に、実行可能プロセスを作成するには、1 つまたは複数の共有オブジェクトを動的実行可能ファイルに結合する必要があります。共有オブジェクトは多くのアプリケーションで使用できるため、その構造上の観点は、共有性、バージョン管理およびパフォーマンスに直接影響します。
リンカーまたは実行時リンカーによる共有オブジェクトの処理は、共有オブジェクトが使用される環境によって次のように区別されます。
共有オブジェクトは、リンカーによって処理され、動的実行可能ファイルまたはほかの共有オブジェクトを生成します。共有オブジェクトは、生成される出力ファイルの依存関係になります。
動的リンクという言葉は、しばしば、いくつかのリンク概念を含めて使用されます。動的リンクは、リンカープロセスの動的実行可能ファイルおよび共有オブジェクトを生成する部分を指します。動的リンクは、実行可能プロセスを生成するこれらのオブジェクトの実行時リンクも指します。動的リンクを使用すると、実行時にアプリケーションを共有オブジェクトへ結合することによって、共有オブジェクトが提供するコードを複数のアプリケーションで使用できます。
標準ライブラリのサービスからアプリケーションを切り離すことにより、動的リンクも、アプリケーションの移植性および拡張性を向上させることができます。サービスのインタフェースと実装が独立しているため、アプリケーションの安定性を維持しながら、システムを更新することができます。動的リンクは、ABI (アプリケーションバイナリインタフェース) を利用するときに必要不可欠な要素で、Solaris OS アプリケーションに適したコンパイル方式です。
システムコンポーネントとアプリケーションコンポーネントの間に定義されたバイナリインタフェースを利用すれば、これらのコンポーネントを非同期的に更新できます。Solaris OS リンカーは、これらのインタフェース上で稼動し、アプリケーションを実行できるように組み合わせます。Solaris OS リンカーによって処理されるどのコンポーネントにもバイナリインタフェースがありますが、Solaris システムが提供するバイナリインタフェースを総称して、「Solaris ABI」と言います。
Solaris ABI は、「System V アプリケーションバイナリインタフェース」によって始まった ABI の成果の技術上の子孫です。この成果は、SPARC International, Inc.® によって行われた SPARC プロセッサ向けの追加により発展し、「SPARC Compliance Definition (SCD)」と呼ばれます。
リンカーは 32 ビットアプリケーションおよび 64 ビットアプリケーションとして提供されています。各リンカーは 32 ビットオブジェクトおよび 64 ビットオブジェクトで動作可能です。64 ビット環境を実行するシステムでは、両方のバージョンのリンカーを実行できます。32 ビット環境を実行するシステムでは、32 ビットバージョンのリンカーのみを実行できます。詳細については、「32 ビットリンカーと 64 ビットリンカー」を参照してください。
実行時リンカーは 32 ビットオブジェクトおよび 64 ビットオブジェクトとして提供されています。32 ビットオブジェクトは 32 ビットプロセスを実行するために使用され、64 ビットオブジェクトは 64 ビットプロセスを実行するために使用されます。
32 ビットオブジェクト上および 64 ビットオブジェクト上のリンカーの操作に違いはありません。このマニュアルでは、多くの場合、32 ビットオブジェクトでの操作の例を使用します。64 ビットの処理が 32 ビットの処理と異なる場合には説明します。
64 ビットアプリケーションについては、『Solaris 64 ビット 開発ガイド』を参照してください。
リンカーは、たとえば LD_LIBRARY_PATH など、LD_ から始まる環境変数を多数サポートしています。これらの環境変数は、この汎用形式でも使用できますが、_32 または _64 を接尾辞として指定することもできます (LD_LIBRARY_PATH_64 など)。この接尾辞は、環境変数をそれぞれ 32 ビットまたは 64 ビットプロセス固有のものにします。またこの接尾辞は、接尾辞の付いていない汎用形式の環境変数が有効な場合でも、それに優先します。
Solaris 10 よりも前のリリースでは、リンカーは値なしで指定された環境変数を無視していました。したがって、次の例では、汎用環境変数設定である /opt/lib が 32 ビットアプリケーション prog の依存関係の検索に使われていました。
$ LD_LIBRARY_PATH=/opt/lib LD_LIBRARY_PATH_32= prog |
Solaris 10 リリースでは、接尾辞 _32 または _64 を持つ、値なしで指定された環境変数も処理されるようになりました。これらの環境変数は、関連する汎用環境変数設定を事実上取り消します。このため、前の例で、32 ビットアプリケーション prog の依存関係を検索するために、/opt/lib が使われることはありません。
このマニュアルでは、リンカーの環境変数を記述する場合は、接尾辞の付いていない汎用形式を使用します。サポートされているすべての環境変数は、ld(1) および ld.so.1(1) に定義されています。
Solaris OS では、いくつかのサポートツールとライブラリも提供しています。これらのツールを使用すると、これらのオブジェクトとリンク処理の分析や検査が行えます。これらのツールには、elfdump(1)、lari(1)、nm(1)、dump(1)、ldd(1)、pvs(1)、elf(3ELF)、およびリンカーデバッグサポートライブラリが含まれます。これらのツールについては、例を使用して詳しく説明します。