プログラミングインタフェース

Solaris ライブラリにおけるシンボルバージョン管理

Solaris リンクエディタと実行時リンカーは、2 種類のライブラリ管理 (ファイルバージョン管理とシンボルバージョン管理) を使用します。ファイルバージョン管理では、ライブラリの名前にバージョン番号が (libc.so.1 のように) 追加されます。このようなライブラリにある 1 つまたは複数の公開インタフェースに互換性のない変更を行うと、バージョン番号は (libc.so.2 のように) インクリメントされます。 動的にリンクされるアプリケーションでは、構築時にバインドしたシンボルが実行時にライブラリに存在しないことがあります。シンボルバージョン管理では、Solaris リンカーはシンボルのセットに名前を関連付けます。Solaris リンカーは次に、実行時のリンク中、その名前がライブラリに存在するかどうかを確認して、関連付けたシンボルが存在することを検証します。

ライブラリシンボルバージョン管理では、シンボルのセットにシンボルバージョン名を関連付け、その名前に番号付けスキーマがある場合は、マップファイルを使用して番号を関連付けます。次の例は、架空の Sun ライブラリ libfoo.so.1 のマップファイルです。

        SUNW_1.2 {
            global:
                symbolD;
                symbolE
        } SUNW_1.1;

        SUNW_1.1 {
            global:
                symbolA;
                symbolB;
                symbolC;
        };

        SUNWprivate {
            global:
                __fooimpl;
            local: *;
        };

このマップファイルでは、symbolAsymbolB、および symbolC がバージョン SUNW_1.1 に関連付けられ、symbolD および symbolESUNW_1.2 に関連付けられ、SUNW_1.2SUNW_1.1 に関連付けられたすべてのシンボルを継承しています。シンボル __fooimpl は、継承チェーンを持たない異なる名前付きセット SUNWprivate に関連付けられています。

構築時、リンクエディタはアプリケーションが使用しているシンボルを調査します。リンクエディタは次に、これらのシンボルが依存しているアプリケーションにセット名を記録します。(番号付け継承) チェーンを持っているセットの場合、リンクエディタは、アプリケーションが使用するすべてのシンボルが含まれる最小限の名前付きセットを記録します。たとえば、アプリケーションが symbolA および symbolB だけを使用する場合、リンクエディタは SUNW_1.1 への依存関係を記録します。また、アプリケーションが symbolAsymbolB、および symbolD を使用する場合、SUNW_1.2SUNW_1.1 を取り込んでいるため、リンクエディタは SUNW_1.2 への依存関係を記録します。

実行時、リンカーは、依存関係としてアプリケーションに記録されたバージョン名がリンクされるライブラリに存在しているかどうかをチェックします。このプロセスによって、必要なシンボルが存在しているかどうかをすばやく確認できます。詳細は、『リンカーとライブラリ』を参照してください。


注 –

マップファイル内の「local:*」指令は、明示的に名前付きセットに関連付けられていないライブラリ内のシンボルは、その有効範囲がライブラリにローカルであることを意味します。つまり、このように有効範囲がローカルに制限されたシンボルはライブラリの外からは見えないことを意味します。この規約は、シンボルが見えるのは、シンボルバージョン管理名に関連付けられているときだけであることを保証します。