このマニュアルは、Solaris リンカーと実行時リンカーに加え、これらが動作するオブジェクトについて説明しています。Solaris リンカーの基本的な動作には、オブジェクトの結合、1 つのオブジェクトから別のオブジェクト内にあるシンボル定義へのシンボルリファレンスの接続があります。この動作は、通常、結合と呼ばれます。
このマニュアルは次の部分に展開されます。
リンカー ld(1) は、1 つまたは複数の入力ファイル (再配置可能なオブジェクト、共有オブジェクト、またはアーカイブライブラリのいずれか) を連結して、1 つの出力ファイルを作成します (再配置可能オブジェクト、実行可能アプリケーション、または共有オブジェクトのいずれか)。リンカーは、通常、コンパイル環境の一環として呼び出されます (cc(1) を参照)。
実行時リンカー ld.so.1(1) [ld.so.1 は共有オブジェクトの特殊ケースなのでバージョンの更新が可能です。ここではバージョン No.1 が使われていますが、Solaris の今後のリリースによってバージョンを重ねていきます。] は、実行時に動的実行可能ファイルと共有オブジェクトを処理し、これらを結合して実行可能なプロセスを作成します。
共有オブジェクト (「共有ライブラリ」と呼ぶ場合もある) とは、リンク編集フェーズからの出力の書式の 1 つです。ただし、パワフルでフレキシブルな実行時環境を作成する上でのこれらの重要性は、それぞれの節で説明しています。
これらの領域は、それぞれのトピックに分割できますが、重複する部分も多いため、このマニュアルでは、各領域について説明する場合には、接続の原理と設計を同時に説明しています。
リンク編集では、さまざまな入力ファイルを cc(1)、as(1) または ld(1) から入手し、これらの入力ファイル内のデータを連結し、1 つの出力ファイルの形式に変換します。リンカーでは、多数のオプションが使用できますが、作成された出力ファイルは、次の 4 つの基本タイプのいずれかになります。
実行可能ファイルに結合されたすべてのシンボル参照を持ち、このようにして実行可能プロセスを示す、入力再配置可能オブジェクトの連結。
実行時リンカーが実行可能プロセスを作成する場合に必要な、入力再配置可能オブジェクトの連結。そのシンボルリファレンスは、実行時に結合される必要があり、さらに 1 つまたは複数の共有オブジェクト形式の依存関係を持ちます。
実行時に動的実行可能ファイルと結合される可能性があるサービスを提供する入力再配置可能オブジェクトの連結。また、共有オブジェクトの中にも、他の共有オブジェクトに依存する依存関係がある場合もあります。
これらの出力ファイルと、出力ファイルを作成する場合に使用するキーリンカーオプションを、図 1-1 に示します。
「動的実行可能ファイル」と「共有オブジェクト」を、通常、2 つ合わせて「動的オブジェクト」と呼びます。このマニュアルでは、この 2 つに焦点をあてて説明しています。
実行時リンクには、通常、過去のリンク編集から生成された 1 つまたは複数のオブジェクトの結び付けが組み込まれ、実行可能プロセスを生成します。リンカーによるこれらのオブジェクトの生成中に、結び付けの必要条件が検証され、該当する登録情報が各オブジェクトに追加され、実行時リンカーの対応付け、再配置、結合プロセスの完了が可能になります。
プロセスの実行中に、実行時リンカーの機能も使用可能になり、この機能を使用すると、要求に応じて追加共有オブジェクトを追加して、プロセスのアドレススペースを拡張できます。実行時リンクに組み込まれたコンポーネントのうち、最も一般的なのは、「動的実行可能ファイル」と「共有用オブジェクト」の 2 つです。
動的実行可能ファイルとは、実行時リンカーの制御下で実行されるアプリケーションのことです。これらのアプリケーションは、通常、共有オブジェクト形式の依存関係を持ち、これらは、実行時リンカーによって配置および結合されて、実行可能プロセスが作成されます。動的実行可能ファイルは、リンカーによって生成されるデフォルトの出力ファイルになります。
共有オブジェクトは、動的にリンクされたシステムに対し、キー構築ブロックを提供します。基本的には、共有オブジェクトは動的実行可能ファイルに類似していますが、共有オブジェクトには、仮想アドレスが割り当てられていません。
動的実行可能ファイルは、通常、1 つまたは複数の共有オブジェクトに依存する依存関係を持ちます。つまり、共有オブジェクトは、動的実行可能ファイルに結合され、実行可能プロセスを作成する必要があります。共有オブジェクトは多くのアプリケーションで使用できるため、その構造上の観点は、共有性、バージョンアップおよびパフォーマンスに直接影響します。
共有オブジェクトが使用する「環境」を参照することにより、リンカーまたは実行時リンカーのいずれかによって共有オブジェクトの処理を識別することができます。
共有オブジェクトは、リンカーによって処理され、動的実行可能ファイルまたは他の共有オブジェクトを生成します。共有オブジェクトは、生成される出力ファイルの依存関係になります。
動的リンクとは、通常、実行可能プロセスを生成する際に、動的実行可能ファイルと共有オブジェクトの実行時リンクとともに、これらのオブジェクトを生成するリンク編集プロセスの一部分を受け入れる場合に使用する用語です。動的リンクを使用すると、実行時にアプリケーションを共有オブジェクトへ結合できるようにすることによって、共有オブジェクトが提供するコードを複数のアプリケーションで使用できます。
標準ライブラリのサービスからアプリケーションを切り離すことにより、動的リンクも、アプリケーションの移植性および拡張性を向上させることができます。サービスの「インタフェース」とその「実現」を切り離すことにより、システムが、アプリケーションの安定性を維持しながら展開することが可能になります。これは、「アプリケーションのバイナリインタフェース」(ABI) を提供する場合に、非常に重要な要素になります。動的リンクは、Solaris アプリケーションのコンパイルメソッドよりも優先されます。
システムとアプリケーションコンポーネントの非同期展開を可能にするには、これらの装置間のバイナリインタフェースを定義します。Solaris リンカーは、これらのインタフェース上で稼動し、実行できるようにアプリケーションを組み合わせます。Solaris リンカーが処理するコンポーネントにはすべてバイナリインタフェースがありますが、このようなインタフェースファミリーの 1 つで、特にアプリケーションライターに有用なものとして、「System V アプリケーションバイナリインタフェース」があります。
「System V アプリケーションのバイナリインタフェース」、または ABI は、コンパイルされたアプリケーションプログラム用にシステムインタフェースを定義します。その目的は、標準バイナリインタフェースを 「System V インタフェース定義、第 3 版」を実現するシステム上のアプリケーションプログラム用に文書化することです。Solaris では、ABI 準拠アプリケーションを生成し、実行できます。 SPARCTM システムでは、ABI は「SPARC Compliance Definition」(SCD) サブセットとして組み込まれています。
このあとの章で説明するトピックの多くは、ABI の影響を受けています。詳細については、該当する ABI マニュアルを参照してください。
リンカーは 32 ビットのオブジェクト上で動作し、SPARCV9 システム上では 64 ビットのオブジェクト上でも動作します。実際には、SPARC システムでは 64 ビットのリンカー (ld(1)) は 32 ビットのオブジェクトを、32 ビットのリンカーは 64 ビットのオブジェクトを生成できます。ただし、32 ビットのリンカーの場合、生成されるオブジェクトのサイズが、.bss を含めずに 2G バイトまでに制限されます。
32 ビットオブジェクトと 64 ビットオブジェクトを区別するために必要となるコマンドラインオプションはありません。リンカーは、最初に見つけた再配置可能ファイルの ELF クラスを使用して動作モードを管理します。32 ビットオブジェクトと 64 ビットオブジェクトを混在させることはできません。
通常、32 ビットオブジェクト上および 64 ビットオブジェクト上のリンカーの動作は同じですが、このマニュアルでは 32 ビットオブジェクトでの動作を例として使用します。64 ビットの処理が 32 ビットの処理と異なる場合には説明します。
64 ビットアプリケーションについては、『Solaris 64 ビット 開発ガイド』を参照してください。
上記のオブジェクトとともに、サポートツールとライブラリもいくつか揃っています。これらのツールを使用すると、これらのオブジェクトとリンクプロセスの分析や検査が行えます。これらのツールには、elfdump(1)、nm(1)、dump(1)、ldd(1)、pvs(1)、elf(3ELF)、およびリンカーデバッギングのサポートライブラリがあります。これらのツールについては、例を用いて詳しく説明します。
この節では、このマニュアルに追加された新しい機能および更新事項 (またはこのいずれか) の概要を記載しています。また、これらは、次のリリースに付加されています。
ファイルを前もってロードする secure ディレクトリが、32 ビットオブジェクトの場合は /usr/lib/secure、64 ビット SPARC オブジェクトの場合 /usr/lib/secure/sparcv9 となった。「セキュリティ」を参照
リンカー -z nodefaultlib オプションおよび新ユーティリティ crle(1) によって作成される実行時構成ファイルを使用することにより、実行時リンカーの検索パスを変更する柔軟性が向上した。「実行時リンカーが検索するディレクトリ」および 「デフォルトの検索パスの設定」を参照
新しい extern mapfile 指示文により、 -z defs の使用に外部的に定義されたシンボルを提供する。「追加シンボルの定義」を参照
新しい $ISALIST、$OSNAME、および $OSREL 動的ストリングトークンにより、命令セット固有かつシステム固有の依存関係を確立する際の柔軟性が向上した。「動的ストリングトークン」を参照.
リンカー -Bsymbolic オプションの使用に関する注意が、 「-Bsymbolic の使用」に追加された
リンカーオプション -p および -P により、「 実行時リンク監査」ライブラリを呼び出す方法が追加された。「ローカル監査の記録 」を参照。「実行時リンク監査」インタフェース la_activity() および la_objsearch()が追加された。「監査インタフェースの関数」を参照
新しい動的セクションタグ DT_CHECKSUM により、ELF ファイルとコアイメージとの統一が可能になった。表 7-41 を参照
64 ビット ELF オブジェクト形式は現在サポートされている。詳細は、「ファイル形式」を参照。64 ビット処理のためのリンカーの拡張機能および異なる機能として、以下のものが含まれる。/usr/lib/sparcv9 の使用 (「リンカーが検索するディレクトリ」、「実行時リンカーが検索するディレクトリ」、および 「命名規約」を参照)、環境変数 LD_LIBRARY_PATH_64
(「環境変数の使用」および 「実行時リンカーによって検索されるディレクトリ」を参照)、および実行時リンカー /usr/lib/sparcv9/ld.so.1 (「概要」を参照)
リンカーの -z combreloc オプションを使用することによって、最適化された再配置セクションを使用して共有オブジェクトを構成できる。「再配置セクションの結合」を参照
新しい $ORIGIN 動的ストリングトークンでは、セットに含まれていないソフトウェア内に依存関係を確立する際の柔軟性が向上した。「動的ストリングトークン」を参照
共有オブジェクトの読み込みは、実行プログラムが実際にそのオブジェクトを参照するまで延期される。「動的依存関係のレイジーローディング」を参照
重複して定義されたシンボルの除去に対処するために、SHT_SUNW_COMDAT セクションが追加された。「Comdat セクション」を参照
シンボルの部分的な初期化に対処するため、SHT_SUNW_move セクションが追加された。「移動セクション」を参照
新しい「実行時リンク監査」のインタフェース la_symbind64()、la_sparcv9_pltenter()、および la_pltexit64() が、新しいリンク監査フラグ LA_SYMB_ALTVALUE とともに付加された。「監査インタフェースの関数」を参照
ウィークシンボルリファレンスは、リンカーの -z weakextract オプションを使用することにより、アーカイブ構成要素の抽出をトリガーできる。すべてのアーカイブ構成要素の抽出は、 -z allextract オプションを使用して実現できる。「アーカイブ処理」を参照
作成されるオブジェクトが参照しないリンク編集の一部として指定された共有オブジェクトは、-z ignore オブジェクトを使用して無視することができ、したがって、その共有オブジェクトの依存関係の記録も抑制できる。「共有オブジェクトの処理」を参照
リンカーは、予約シンボル _START_ および _END_ を生成し、オブジェクトのアドレス範囲を確立する方法を提供する。「出力イメージの生成」を参照
初期設定および終了コードの実行時命令に変更が加えられ、依存関係の必要条件の格納が改善された。「デバッギングエイド」を参照
シンボル解析の解釈方法が、dlopen(3DL) 用に拡張された。「シンボル検索」、「グループの分離」RTLD_GROUP、および 「オブジェクト階層」RTLD_PARENT を参照
シンボル検索の解釈方法が、RTLD_DEFAULT を処理する新しい dlsym(3DL) とともに拡張された。「デフォルトのシンボル検索モデル」を参照
「フィルタ処理」が拡張され、複数の「フィルタ対象」が定義できるようになり、さらに強制的に読み込まれる「フィルタ対象」が使用できるようになった。プラットフォーム固有のフィルタを作成する場合の例も提供されている。「フィルタとしての共有オブジェクト」を参照
mapfile ファイル制御指示語 $ADDVERS を使用すると、追加されたバージョン依存関係の記録が実行できる。「追加バージョン定義への結合」を参照
実行時リンカーの監査インタフェースでは、プロセスの内部から動的にリンクされたアプリケーションの監視および修正のサポートを提供している。「実行時リンカーの監査インタフェース」を参照
実行時リンカーのデバッガインタフェースにより、外部プロセスから動的にリンクされたアプリケーションの監視および修正のサポートが提供される。「実行時リンカーのデバッガインタフェース」を参照
追加のセクションタイプがサポートされている。SHN_BEFORE と SHN_AFTER については 表 7-11、SHF_ORDERED と SHF_EXCLUDE については 表 7-14 を参照
新しい動的セクションタグ DT_1_FLAGS がサポートされている。種々のフラグ値については、表 7-42 を参照
ELF のデモプログラムパッケージが提供されている。第 7 章「オブジェクトファイル」を参照
リンカーは、現在、国際化メッセージをサポートしている。システムエラーはすべて、strerror(3C) を使用して報告される