これは、リンカーのデフォルトの動作方法です。–d y オプションで明示的に指定することもできますが、–d n オプションを使用しない場合には、暗黙のうちに指定されます。
この場合、再配置可能オブジェクト、共有オブジェクト、およびアーカイブライブラリを指定できます。–l オプションを使用すると、ディレクトリ検索が実行され、ここで、各ディレクトリは、共有オブジェクトを見つけるために検索されます。そのディレクトリで共有オブジェクトが見つからない場合は、次にアーカイブライブラリが検索されます。–B static オプションを使用すると、アーカイブライブラリの検索だけに限定されます。共有オブジェクトとアーカイブとの混合体へのリンクを参照してください。
入力再配置可能オブジェクトは、位置独立のコードから作成する必要があります。たとえば、C コンパイラは –K pic オプションで位置独立のコードを生成します。位置独立のコードを参照してください。この要件を強制するには、–z text オプションを使用します。
使用されない再配置可能オブジェクトを含めないようにします。または、参照されていない ELF セクションを削除するようにリンカーに指示する –z discard-unused=sections オプションを使用します。使用されない対象物の削除を参照してください。
アプリケーションレジスタは、エンドユーザーが使用できる SPARC アーキテクチャーの予約済みの機能です。外部で使用することを目的としている SPARC 共有オブジェクトでは、共有オブジェクトがアプリケーションレジスタを使用しないようにするため、C コンパイラに –xregs=no%appl オプションを使用する必要があります。これによって、共有オブジェクトの実装を損なうことなく、すべての外部ユーザーがアプリケーションレジスタを使用できるようになります。
共有オブジェクトの公開インタフェースを確立します。共有オブジェクトの外から見える大域シンボルを定義し、それ以外のすべてのシンボルはローカル範囲に限定します。これは、–mapfile とともに M オプションを指定することにより定義できます。Chapter 10, インタフェースおよびバージョン管理を参照してください。
将来アップグレードに対応できるように、共有オブジェクトにはバージョンを含む名前を使用します。バージョン管理ファイル名の管理を参照してください。
自己完結型の共有オブジェクトは、もっとも柔軟性が高いです。これはオブジェクトが必要とするものすべてを自身が提供している場合に作成されます。自己完結を強制する場合は、–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
共有オブジェクトのパフォーマンスへの影響を考慮します。 共有性を最大限にし (共有可能性の最大化を参照)、 ページング回数を最小にします (ページング回数の削減を参照)。 特にシンボル再配置を最小限にすることにより再配置の無駄を削減し (シンボル範囲の縮小)、 関数インタフェースを経由して、データにアクセスできるようにします (コピー再配置)
リンカーの –z guidance オプションの使用をお勧めします。ガイダンスメッセージは、リンカーオプションに関して、また作成されたオブジェクトを改善できるほかの操作に関して提案します。
–z lazyload オプションを使用して、動的実行可能プログラムの依存関係の遅延読み込みを指定します。動的依存関係の遅延読み込みを参照してください。
不要な依存関係を回避します。不要な依存性を検出および排除するには、–u オプションとともに ldd を使用します。共有オブジェクトの処理を参照。または、–z discard-unused=dependencies オプションを使用して、参照されるオブジェクトに対する依存関係だけを記録するようにリンカーに指示します。
動的実行可能ファイルの依存関係がデフォルトの検索位置にない場合は、–R オプションを使用して出力ファイルにパス名を記録します。実行時リンカーが検索するディレクトリを参照してください。
–B direct を使用して直接結合情報を確立します。Chapter 6, 直接結合を参照してください。
次の例は、上記のポイントを組み合わせたものです。
$ cc -o prog -R /home/lib -z discard-unused=dependencies -z lazyload -B direct -L. \ -lfoo file1.o file2.o file3.o ....