Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

機能による開発の進化

機能を使用すると、プラットフォーム、マシン、またはハードウェア固有のインスタンスによって汎用オブジェクトの機能を拡張できます。これらのインスタンスは通常、新しいシステムやより特殊なシステムを対象とします。しかし、時とともに、かつては特殊であると考えられていた多くの機能がより一般的になっており、コードを実行するすべてのシステムで利用できるようになる可能性があります。そのため、機能を最新の状態に保つには、これらの詳細をときどき見直してオブジェクトを改訂する必要があります。

機能インスタンスは、冗長にならないようにモニターすることが推奨されます。ある機能インスタンスを、使用中のコードが対象となるすべてのシステムで使用できるようになった場合、そのインスタンスの維持は無意味です。機能インスタンスのベースオブジェクトのバージョンを、その機能インスタンスで置き換えることを推奨します。

リンカーは、ソフトウェアを構築するプラットフォームが、ソフトウェアを実行するプラットフォームと同じであると見なすことができません。そのため、リンカーはインスタンスの関連性の徹底的な検証を提供できません。ただし、オブジェクトのシンボル機能がオブジェクトのオブジェクト機能を拡張しない場合は、警告診断を生成できます。

次のオブジェクト foo.so を作成する際、オブジェクト機能とシンボル機能の両方が検出され、シンボル機能はベースオブジェクトの機能を拡張しません。

$ cc -o foo.so -G -Kpic foo.o foo.cap.o
ld: warning: file foo.cap.o: section [3].SUNW_cap: symbol capabilities \
    do not extend object capabilities and are redundant
        (object:  CA_SUNW_HW_1    0x800  [ SSE ]);
        (symbol:  CA_SUNW_HW_1    0x80  [ AMD_MMX ]);

SSE が利用可能で SSE 機能が AMD_MMX より大きくないかぎり foo.so はロードできないため、SSE の存在は AMD_MMX の存在を意味します。そのため、AMD_MMX インスタンスは冗長です。機能インスタンスのベースオブジェクトのバージョンを、その機能インスタンスで置き換えることを推奨します。


注 -  シンボル機能ファミリが存在し、このファミリの少なくとも 1 つのインスタンスが実行可能な場合、実行時には汎用的な先頭のインスタンスではなくこのインスタンスが選択されます。オブジェクト機能は機能インスタンスを超える可能性がありますが、実行時リンカーはこれらのオブジェクト機能が先頭のインスタンスによって使用されているかどうかを判断できません。オブジェクト機能はこの機能ファミリの外にあるコンポーネントだけを取得できます。冗長ファミリインスタンスを保持していると、オブジェクトのパフォーマンスが下がることがあります。