リンカーとライブラリ

概要

リンカーによって処理されるオブジェクトには、他のオブジェクトを結合できる多数の大域シンボルがあります。これらのシンボルは、オブジェクトのアプリケーションバイナリインタフェース (ABI) を記述するものです。オブジェクトの展開中、このインタフェースは、大域シンボルの追加または削除が原因で変更されることがあります。また、オブジェクト展開には、内部実装の変更が関与することがあります。

バージョンアップとは、インタフェースや実装状態の変更を示すためにオブジェクトに適用できるいくつかの手法のことをいいます。これらの手法を使用すると、下位互換性を保ちながらオブジェクト制御による展開を行うことができます。

この章では、オブジェクトの ABI の定義方法について説明し、このインタフェースに対する変更によって下位互換性が受ける影響を分類します。また、インタフェースと実装状態の変更を新しいリリースのオブジェクトに組み込むためのモデルを示します。

この章では、動的実行可能ファイルと共有オブジェクトの実行時インタフェースを中心に説明します。これらの動的オブジェクト内での変更を記述して管理するために使用される手法は、一般的な用語で説明してあります。共有オブジェクトに適用される命名規約とバージョンアップシナリオの共通セットは、付録 B 「バージョンアップの手引き」 に示してあります。

動的オブジェクトの開発者は、インタフェース変更の結果に注意し、特に以前のオブジェクトとの下位互換性を維持するという点で、これらの変更の管理方法を理解する必要があります。

動的オブジェクトによって使用可能になった大域シンボルは、オブジェクトの公共インタフェースを表わします。リンク編集の最後でオブジェクトに残る大域シンボルの数は、公共にしたいと望む数を超える場合がよくあります。これらの大域シンボルは、そのオブジェクトの構築に使用された再配置可能オブジェクトの間で必要な相互関係から引き出されるものであり、オブジェクト自体の専用インタフェースを表わします。

オブジェクトのバイナリインタフェースを定義するには、まず、作成中のオブジェクトから公共に使用できるようにする大域シンボルだけを定義します。これらの公共シンボルは、リンカーの -M オプションと関連の mapfile を最終リンク編集の一部として使用することによって確立できます。この手法は、「シンボル範囲の縮小」に説明されています。この公共インタフェースは、1 つまたは複数のバージョン定義を作成中のオブジェクト内に確立し、オブジェクトの展開時に新しいインタフェースを追加するための基礎を作ります。

次の節は、この初期公共インタフェースに基づいて説明されています。最初に、インタフェースへの各種の変更をどのように分類すると、適切な管理を行えるかを理解しておくと便利です。