これは、リンカーの標準の動作方法です。-d y オプションで明示的に指定することもできますが、-d n オプションを使用しない場合には、暗黙のうちに指定されます。
この場合、再配置可能オブジェクト、共有オブジェクト、およびアーカイブライブラリを指定できます。-l オプションを使用すると、ディレクトリ検索が実行され、ここで、各ディレクトリは、共有オブジェクトを見つけるために検索されます。そのディレクトリで共有オブジェクトが見つからない場合は、次にアーカイブライブラリが検索されます。-B static オプションを使用すると、アーカイブライブラリの検索だけに限定されます。詳細は、共有オブジェクトとアーカイブとの混合体へのリンクを参照してください。
入力再配置可能オブジェクトは、位置に依存しないコードから作成する必要がある。たとえば、C コンパイラは -K pic オプションで位置に依存しないコードを生成する。位置に依存しないコードを参照。この要件を強制するには、-z text オプションを使用する
使用されない再配置可能オブジェクトを含めないようにする。あるいは、リンク編集時に -z ignore オプションを使用して、参照されない ELF セクションの入力をリンカーに排除させる。詳細は、使用されない対象物の削除を参照
共有オブジェクトが外部で使用されることを意図しているものである場合、アプリケーションレジスタを使用しないことを確認する。アプリケーションレジスタを使用しない場合、外部ユーザーは、共有オブジェクトの実装を気にすることなくこれらのレジスタを自由に使用できる。たとえば、SPARC C コンパイラは、-xregs=no%appl オプションを指定すると、アプリケーションレジスタを使用しない
共有オブジェクトの公開インタフェースを確立する。共有オブジェクトの外から見える大域シンボルを定義し、それ以外のすべてのシンボルはローカル範囲に隠薮する。これは、mapfile と共に -M オプションを指定することにより定義できる。詳細は、付録 B 「バージョン管理の手引き」を参照
将来アップグレードに対応できるように、共有オブジェクトにはバージョンを含む名前を使用する。バージョン管理ファイル名の管理を参照
自己完結型の共有オブジェクトは、最も柔軟性が高い。これはオブジェクトが必要とするものすべてを自身が提供している場合に作成される。自己完結を強制する場合は、-z defs オプションを指定する。共有オブジェクト出力ファイルの生成を参照
不必要な依存性を排除する。不要な依存性を検出および排除するには、-u とともに ldd オプションを使用する。共有オブジェクトの処理を参照。または、-z ignore オプションを使用して、参照されるオブジェクトに対する依存性だけを記録する
生成される共有オブジェクトが他の共有オブジェクトに依存している場合は、-z lazyload オプションを使用して遅延読み込みを指定する。動的依存関係の遅延読み込みを参照
生成される共有オブジェクトが他の共有オブジェクトと依存関係があり、これらの依存関係が 32 ビットオブジェクト用 /usr/lib または 64 ビットオブジェクト用 /usr/lib/64 に存在しない場合は、-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 オプションを使用して、動的実行プログラムの依存関係の遅延読み込みを指定する。 動的依存関係の遅延読み込みを参照
動的実行プログラムの依存関係が 32 ビットオブジェクト用 /usr/lib または 64 ビットオブジェクト用 /usr/lib/64 に存在しない場合、-R オプションを使用してパス名を出力ファイルに記録する。実行時リンカーが検索するディレクトリを参照
-B direct を使用して直接結合情報を確立する。直接結合を参照
次の例は、説明したオプションを組み合わせたものです。
$ cc -o prog -R /home/lib -z ignore -z lazyload -B direct -L. \ -lfoo file1.o file2.o file3.o ..... |