Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

共有オブジェクトの作成

  • 共有オブジェクトを作成する場合、–G オプションを使用します。–d y は省略時にはデフォルトで暗黙指定されるため、指定する必要はありません。

  • リンカーの –z guidance オプションの使用をお勧めします。ガイダンスメッセージは、リンカーオプションに関して、また作成されたオブジェクトを改善できるほかの操作に関して提案します。

  • 入力再配置可能オブジェクトは、位置独立のコードから作成する必要があります。たとえば、C コンパイラは –K pic オプションで位置独立のコードを生成します。位置独立のコードを参照してください。この要件を強制するには、–z text オプションを使用します。

  • 使用されない再配置可能オブジェクトを含めないようにします。または、参照されていない ELF セクションを削除するようにリンカーに指示する –z discard-unused=sections オプションを使用します。使用されない対象物の削除を参照してください。

  • アプリケーションレジスタは、エンドユーザーが使用できる SPARC アーキテクチャーの予約済みの機能です。外部で使用することを目的としている SPARC 共有オブジェクトでは、共有オブジェクトがアプリケーションレジスタを使用しないようにするため、C コンパイラに –xregs=no%appl オプションを使用する必要があります。これによって、共有オブジェクトの実装を損なうことなく、すべての外部ユーザーがアプリケーションレジスタを使用できるようになります。

  • 共有オブジェクトの公開インタフェースを確立します。共有オブジェクトの外から見える大域シンボルを定義し、それ以外のすべてのシンボルはローカル範囲に限定します。これは、–mapfile とともに M オプションを指定することにより定義できます。Chapter 9, インタフェースおよびバージョン管理を参照してください。

  • 将来アップグレードに対応できるように、共有オブジェクトにはバージョンを含む名前を使用します。バージョン管理ファイル名の管理を参照してください。

  • 自己完結型の共有オブジェクトは、もっとも柔軟性が高いです。これはオブジェクトが必要とするものすべてを自身が提供している場合に作成されます。自己完結を強制する場合は、–z defs オプションを指定します。共有オブジェクト出力ファイルの生成を参照

  • 不要な依存関係を回避します。不要な依存性を検出および排除するには、–u オプションとともに ldd を使用します。共有オブジェクトの処理を参照。または、–z discard-unused=dependencies オプションを使用して、参照されるオブジェクトに対する依存関係だけを記録するようにリンカーに指示します。

  • 生成される共有オブジェクトがほかの共有オブジェクトに依存している場合は、–z lazyload オプションを使用して遅延読み込みを指定します。動的依存関係の遅延読み込みを参照してください。

  • 生成中の共有オブジェクトがほかの共有オブジェクトに依存していて、これらの依存関係がデフォルトの検索場所にはない場合は、–R オプションを使用して出力ファイルにパス名を記録します。依存関係を持つ共有オブジェクトを参照してください。

  • このオブジェクトや関連する依存関係で割り込みシンボルが使用されない場合は、–B direct を使って直接結合情報を確立します。Chapter 6, 直接結合を参照してください。

次の例は、上記のポイントを組み合わせたものです。

$ cc -c -o foo.o -K pic -xregs=no%appl foo.c
$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \
    -z discard-unused=sections -R /home/lib foo.o -L. -lbar -lc
  • 生成される共有オブジェクトを、ほかのリンク編集への入力として使用する場合は、–h オプションを使用して、内部に共有オブジェクトの実行名を記録します。共有オブジェクト名の記録を参照してください。

  • 共有オブジェクトを、バージョンを含まない名前のファイルにシンボリックリンクして、その共有オブジェクトをコンパイル環境でも使用できるようにします。バージョン管理ファイル名の管理を参照してください。

次の例は、上記のポイントを組み合わせたものです。

$ cc -M mapfile -G -o libfoo.so.1 -z text -z defs -B direct -z lazyload \
    -z discard-unused=sections -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc
$ ln -s libfoo.so.1 libfoo.so