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

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.2 SUNW_1.1 に関連付けられたすべてのシンボルを継承することを意味します。シンボル __fooimpl は、継承チェーンを持たない異なる名前付きセット SUNWprivate に関連付けられています。

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

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


注 –

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