以降の節には、リンカーでもっとも一般的に使用するシナリオの概要が記載してあります。これは、実際に操作を行う際の「虎の巻」として利用できます。リンカーによって生成される出力モジュールの種類については、「リンク編集」を参照してください。
記載された例には、コンパイラドライバに指定するリンカーのオプションが示されています。リンカーを起動するには、これらのオプションを使用するのがもっとも一般的です。例の中では、cc(1) を使用しています。「コンパイラドライバを使用する」を参照してください。
リンカーは、入力ファイルの名前によって動作を変えることはありません。各ファイルは、開かれ、検査が行われて、必要な処理の種類が判別されます。「入力ファイルの処理」を参照してください。
libx.so の命名規約に従って命名された共有オブジェクトと、lib x.a の命名規約に従って命名されたアーカイブライブラリは、-l オプションを使用して指定できます。「ライブラリの命名規約」を 参照してください。これにより、-L オプションを使用して指定できる検索パスに、より柔軟性を持たせることができます。「リンカーが検索するディレクトリ」を参照してください。
リンカーは、基本的には、「静的」または「動的」の 2 つの方法のうちのいずれかで稼動します。
静的方法は、-d n オプションが使用された場合に選択され、また、このモードを使用すると、再配置可能オブジェクトと静的実行プログラムを作成できます。この場合、再配置可能オブジェクトとアーカイブライブラリの入力形式だけが受け入れられます。-l オプションを使用すると、アーカイブライブラリが検索されます。
$ cc -dn -r -o temp.o file1.o file2.o file3.o ..... |
静的実行プログラムの使用は制限されています。「静的実行可能ファイル」を参照してください。静的実行プログラムには、通常、プラットフォーム固有な実装に依存した情報などが組み込まれ、これにより、ほかのプラットフォーム上で実行プログラムを実行することが制限されます。Solaris OS ライブラリの多くの実装は、dlopen(3C) や、dlsym(3C) などの動的リンク機能に依存しています。「追加オブジェクトの読み込み」を参照してください。これらの機能は、静的実行プログラムでは使用できません。
静的実行プログラムを作成するには、-r オプションを指定せずに -d n オプションを使用します。
$ cc -dn -o prog file1.o file2.o file3.o ..... |
-a オプションを使用して、静的実行可能プログラムの作成を指示できます。-r オプションを指定せずに -d n を使用した場合は、-a オプションと同じです。
これは、リンカーのデフォルトの動作方法です。-d y オプションで明示的に指定することもできますが、-d n オプションを使用しない場合には、暗黙のうちに指定されます。
この場合、再配置可能オブジェクト、共有オブジェクト、およびアーカイブライブラリを指定できます。-l オプションを使用すると、ディレクトリ検索が実行され、ここで、各ディレクトリは、共有オブジェクトを見つけるために検索されます。そのディレクトリで共有オブジェクトが見つからない場合は、次にアーカイブライブラリが検索されます。-B static オプションを使用すると、アーカイブライブラリの検索だけに限定されます。「共有オブジェクトとアーカイブとの混合体へのリンク」を参照してください。
入力再配置可能オブジェクトは、位置独立のコードから作成する必要があります。たとえば、C コンパイラは -K pic オプションで位置独立のコードを生成します。「位置独立のコード」を参照してください。この要件を強制するには、-z text オプションを使用します。
使用されない再配置可能オブジェクトを含めないようにします。または、参照されていない ELF セクションを削除するようにリンカーに指示する -z ignore オプションを使用します。「使用されない対象物の削除」を参照してください。
共有オブジェクトが外部での使用を意図しているものである場合、アプリケーションレジスタを使用しないことを確認します。アプリケーションレジスタを使用しない場合、外部ユーザーは、共有オブジェクトの実装を気にすることなくこれらのレジスタを自由に使用できます。たとえば、SPARC C コンパイラは、-xregs=no%appl オプションを指定すると、アプリケーションレジスタを使用しません。
共有オブジェクトの公開インタフェースを確立します。共有オブジェクトの外から見える大域シンボルを定義し、それ以外のすべてのシンボルはローカル範囲に限定します。これは、-mapfile とともに M オプションを指定することにより定義できます。付録 B バージョン管理の手引きを参照してください。
将来アップグレードに対応できるように、共有オブジェクトにはバージョンを含む名前を使用します。「バージョン管理ファイル名の管理」を参照してください。
自己完結型の共有オブジェクトは、もっとも柔軟性が高いです。これはオブジェクトが必要とするものすべてを自身が提供している場合に作成されます。自己完結を強制する場合は、-z defs オプションを指定します。「共有オブジェクト出力ファイルの生成」を参照
不要な依存性を排除します。不要な依存性を検出および排除するには、-u オプションとともに ldd を使用します。「共有オブジェクトの処理」を参照。または、-z ignore オプションを使用して、参照されるオブジェクトに対する依存性だけを記録するようにリンカーに指示します。
生成される共有オブジェクトがほかの共有オブジェクトに依存している場合は、-z lazyload オプションを使用して遅延読み込みを指定します。「動的依存関係の遅延読み込み」を参照してください。
生成中の共有オブジェクトがほかの共有オブジェクトに依存していて、これらの依存関係がデフォルトの検索場所にはない場合は、-R オプションを使用して出力ファイルにパス名を記録します。「依存関係を持つ共有オブジェクト」を参照してください。
複数の再配置セクションを単一の .SUNW_reloc セクションに結合することによって、再配置処理を最適化します。-z combreloc オプションを使用します。
このオブジェクトや関連する依存関係で割り込みシンボルが使用されない場合は、-B direct を使って直接結合情報を確立します。「直接結合」を参照してください。
次の例は、説明したオプションを組み合わせたものです。
$ 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 combreloc -z ignore -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 combreloc -z ignore -R /home/lib -h libfoo.so.1 foo.o -L. -lbar -lc $ ln -s libfoo.so.1 libfoo.so |
共有オブジェクトのパフォーマンスへの影響を考慮します。 共有性を最大限にし (「共有可能性の最大化」を参照)、 ページング回数を最小にします (「ページング回数の削減」を参照)。 特にシンボル再配置を最小限にすることにより再配置の無駄を削減し (「シンボル範囲の縮小」)、 関数インタフェースを経由して、データにアクセスできるようにします (「コピー再配置」)
-z lazyload オプションを使用して、動的実行可能プログラムの依存関係の遅延読み込みを指定します。「動的依存関係の遅延読み込み」を参照してください。
不要な依存性を排除します。不要な依存性を検出および排除するには、-u オプションとともに ldd を使用します。「共有オブジェクトの処理」を参照。または、-z ignore オプションを使用して、参照されるオブジェクトに対する依存性だけを記録するようにリンカーに指示します。
動的実行可能ファイルの依存関係がデフォルトの検索位置にない場合は、-R オプションを使用して出力ファイルにパス名を記録します。「実行時リンカーが検索するディレクトリ」を参照してください。
-B direct を使用して直接結合情報を確立します。「直接結合」を参照してください。
次の例は、説明したオプションを組み合わせたものです。
$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \ -lfoo file1.o file2.o file3.o ..... |