リンカーとライブラリ

第 1 章 Solaris OS リンカーの紹介

このマニュアルは、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–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 ビットアプリケーションとして提供されています。各リンカーは 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)、およびリンカーデバッグサポートライブラリが含まれます。これらのツールについては、例を使用して詳しく説明します。