リンカーとライブラリ

第 1 章 序章

概要

このマニュアルは、Solaris リンカーと実行時リンカーに加え、これらが動作するオブジェクトについて説明しています。Solaris リンカーの基本的な動作には、オブジェクトの結合、1 つのオブジェクトから別のオブジェクト内にあるシンボル定義へのシンボルリファレンスの接続があります。この動作は、通常、結合と呼ばれます。

このマニュアルは次の部分に展開されます。

「リンカー」

リンカー ld(1) は、1 つまたは複数の入力ファイル (再配置可能なオブジェクト、共有オブジェクト、またはアーカイブライブラリのいずれか) を連結して、1 つの出力ファイルを作成します (再配置可能オブジェクト、実行可能アプリケーション、または共有オブジェクトのいずれか)。リンカーは、通常、コンパイル環境の一環として呼び出されます (cc(1) を参照)。

「実行時リンカー」

実行時リンカー ld.so.1(1) は、実行時に動的実行可能ファイルと共有オブジェクトを処理し、これらを結合して実行可能なプロセスを作成します。


注 -

ld.so.1 は共有オブジェクトの特殊ケースなのでバージョンの更新が可能です。ここではバージョンナンバー 1 が使われていますが、Solaris の今後のリリースによってバージョンアップされてゆく可能性があります。


「共有オブジェクト」

共有オブジェクト (「共有ライブラリ」と呼ぶ場合もある) とは、リンク編集フェーズからの出力の書式の 1 つです。ただし、パワフルでフレキシブルな実行時環境を作成する上でのこれらの重要性は、それぞれの節で説明しています。

「オブジェクトファイル」

Solaris リンカーは、実行可能なリンク書式 (ELF) に適合するファイルを使用して稼動します。

これらの領域は、それぞれのトピックに分割できますが、重複する部分も多いため、このマニュアルでは、各領域について説明する場合には、接続の原理と設計を同時に説明しています。

リンク編集

リンク編集では、さまざまな入力ファイルを cc(1)as(1) または ld(1) から入手し、これらの入力ファイル内のデータを連結し、1 つの出力ファイルの形式に変換します。リンカーでは、多数のオプションが使用できますが、作成された出力ファイルは、次の 4 つの基本タイプのいずれかになります。

「再配置可能オブジェクト」

入力再配置可能オブジェクトの連結。これは、後続のリンク編集フェーズ内で使用されます。

「静的実行可能ファイル」

実行可能ファイルに結合されたすべてのシンボル参照を持ち、このようにして実行可能プロセスを示す、入力再配置可能オブジェクトの連結。

「動的実行可能ファイル」

実行時リンカーが実行可能プロセスを作成する場合に必要な、入力再配置可能オブジェクトの連結。そのシンボルリファレンスは、実行時に結合される必要があり、さらに 1 つまたは複数の共有オブジェクト形式の依存関係を持ちます。

「共有オブジェクト」

実行時に動的実行可能ファイルと結合される可能性があるサービスを提供する入力再配置可能オブジェクトの連結。また、共有オブジェクトの中にも、他の共有オブジェクトに依存する依存関係がある場合もあります。

これらの出力ファイルと、出力ファイルを作成する場合に使用するキーリンカーオプションを、図 1-1 に示します。

「動的実行可能ファイル」と「共有オブジェクト」を、通常、2 つ合わせて「動的オブジェクト」と呼びます。このマニュアルでは、この 2 つに焦点をあてて説明しています。

図 1-1 静的または動的リンク編集

Graphic

実行時リンク

実行時リンクには、通常、過去のリンク編集から生成された 1 つまたは複数のオブジェクトの結び付けが組み込まれ、実行可能プロセスを生成します。リンカーによるこれらのオブジェクトの生成中に、結び付けの必要条件が検証され、該当する登録情報が各オブジェクトに追加され、実行時リンカーの対応付け、再配置、結合プロセスの完了が可能になります。

プロセスの実行中に、実行時リンカーの機能も使用可能になり、この機能を使用すると、要求に応じて追加共有オブジェクトを追加して、プロセスのアドレススペースを拡張できます。実行時リンクに組み込まれたコンポーネントのうち、最も一般的なのは、「動的実行可能ファイル」と「共有用オブジェクト」の 2 つです。

動的実行可能ファイル

動的実行可能ファイルとは、実行時リンカーの制御下で実行されるアプリケーションのことです。これらのアプリケーションは、通常、共有オブジェクト形式の依存関係を持ち、これらは、実行時リンカーによって配置および結合されて、実行可能プロセスが作成されます。動的実行可能ファイルは、リンカーによって生成されるデフォルトの出力ファイルになります。

共有オブジェクト

共有オブジェクトは、動的にリンクされたシステムに対し、キー構築ブロックを提供します。基本的には、共有オブジェクトは動的実行可能ファイルに類似していますが、共有オブジェクトには、仮想アドレスが割り当てられていません。

動的実行可能ファイルは、通常、1 つまたは複数の共有オブジェクトに依存する依存関係を持ちます。つまり、共有オブジェクトは、動的実行可能ファイルに結合され、実行可能プロセスを作成する必要があります。共有オブジェクトは多くのアプリケーションで使用できるため、その構造上の観点は、共有性、バージョンアップおよびパフォーマンスに直接影響します。

共有オブジェクトが使用する「環境」を参照することにより、リンカーまたは実行時リンカーのいずれかによって共有オブジェクトの処理を識別することができます。

「コンパイル環境」

共有オブジェクトは、リンカーによって処理され、動的実行可能ファイルまたは他の共有オブジェクトを生成します。共有オブジェクトは、生成される出力ファイルの依存関係になります。

「実行時環境」

共有オブジェクトは、動的実行可能ファイルとともに実行時リンカーによって処理され、実行可能プロセスを作成します。

関連情報

動的リンク

動的リンクとは、通常、実行可能プロセスを生成する際に、動的実行可能ファイルと共有オブジェクトの実行時リンクとともに、これらのオブジェクトを生成するリンク編集プロセスの一部分を受け入れる場合に使用する用語です。動的リンクを使用すると、実行時にアプリケーションを共有オブジェクトへ結合できるようにすることによって、共有オブジェクトが提供するコードを複数のアプリケーションで使用できます。

標準ライブラリのサービスからアプリケーションを切り離すことにより、動的リンクも、アプリケーションの移植性および拡張性を向上させることができます。サービスの「インタフェース」とその「実現」を切り離すことにより、システムが、アプリケーションの安定性を維持しながら展開することが可能になります。これは、「アプリケーションのバイナリインタフェース」(ABI) を提供する場合に、非常に重要な要素になります。動的リンクは、Solaris アプリケーションのコンパイルメソッドよりも優先されます。

アプリケーションのバイナリインタフェース

システムとアプリケーションコンポーネントの非同期展開を可能にするには、これらの装置間のバイナリインタフェースを定義します。Solaris リンカーは、これらのインタフェース上で稼動し、実行できるようにアプリケーションを組み合わせます。Solaris リンカーが処理するコンポーネントにはすべてバイナリインタフェースがありますが、このようなインタフェースファミリーの 1 つで、特にアプリケーションライターに有用なものとして、「System V アプリケーションバイナリインタフェース」があります。

「System V アプリケーションのバイナリインタフェース」、または ABI は、コンパイルされたアプリケーションプログラム用にシステムインタフェースを定義します。その目的は、標準バイナリインタフェースを「System V Interface Definition, Third Edition」を実現するシステム上のアプリケーションプログラム用に文書化することです。Solaris では、ABI 準拠アプリケーションを生成し、実行できます。SPARCTM システムでは、ABI は「SPARC Compliance Definition」(SCD) サブセットとして組み込まれています。

この後の章で説明するトピックの多くは、ABI の影響を受けています。詳細については、該当する ABI マニュアルを参照してください。

32 ビットおよび 64 ビット環境

リンカーは 32 ビットのオブジェクト上で動作し、SPARCV9 システム上では 64 ビットのオブジェクト上でも動作します。実際には、SPARC システムでは 64 ビットのリンカー (ld(1)) は 32 ビットのオブジェクトを、32 ビットのリンカーは 64 ビットのオブジェクトを生成できます。ただし、32 ビットのリンカーの場合、生成されるオブジェクトのサイズが、.bss を含めずに 2G バイトまでに制限されます。

一般に、32 ビットのリンク編集と 64 ビットのリンク編集を区別するために必要となるコマンドラインオプションはありません。リンカーは、最初に見つけた ELF オブジェクトの ELF クラスを使用して動作モードを管理します。mapfile やアーカイブライブラリのみからのリンクなどの、特別なリンク編集では、それらの入力ファイルの影響を受けず、デフォルトで 32 ビットモードになります。これらのケースでは、-64 オプションで 64 ビットのリンク編集を行うことができます。32 ビットオブジェクトと 64 ビットオブジェクトを混在させることはできません。

通常、32 ビットオブジェクト上および 64 ビットオブジェクト上のリンカーの動作は同じですが、このマニュアルでは 32 ビットオブジェクトでの動作を例として使用します。64 ビットの処理が 32 ビットの処理と異なる場合には説明します。

64 ビットアプリケーションについては、『Solaris 64 ビット 開発ガイド』を参照してください。

環境変数

リンカーでは、LD_ という文字で始まる環境変数を多数サポートしています。各環境変数は、この一般形式、またはこれに _32_64 の接尾辞を追加した形式が可能です。この接尾辞は、環境変数をそれぞれ 32 ビットまたは 64 ビットプロセス固有のものにし、また影響のある一般の、接尾辞の付いていない環境変数のバージョンをオーバライドします。

このマニュアルでは、リンカーの環境変数と記述してある場合は、一般の、接尾辞の付いていない形式を使用するものとします。サポートされているすべての環境変数のリストは、ld(1) または ld.so.1(1) を参照してください。

サポートするツール

上記のオブジェクトとともに、サポートツールとライブラリもいくつか揃っています。これらのツールを使用すると、これらのオブジェクトとリンクプロセスの分析や検査が行えます。これらのツールには、elfdump(1)nm(1)dump(1)ldd(1)pvs(1)elf(3ELF)、およびリンカーデバッギングのサポートライブラリがあります。これらのツールについては、例を用いて詳しく説明します。

更新された機能

これまでの各リリースでこのマニュアルに追加された新しい機能と更新事項の全リストは、付録 D 「『リンカーとライブラリ』の更新箇所」 に記載されています。