-G オプションを使用する (-dy は省略時には暗黙指定されるため、指定する必要はない)
入力再配置可能オブジェクトは、位置非依存のコードから作成する必要がある。-z text オプションを使用して、この必要条件を実行する (「位置に依存しないコード」を参照)
共有オブジェクトの公開インタフェースを確立する。共有オブジェクトの外から見える大域シンボルを定義し、それ以外のすべてのシンボルはローカル範囲に隠薮する。これは、-M オプションとともに mapfile を指定することによって定義できる。詳細は、付録 B 「バージョンアップの手引き」 を参照
将来アップグレードに対応できるように、共有オブジェクトにはバージョンを含む名前を使用する (「バージョンアップファイル名の管理」を参照)
生成される共有オブジェクトが他の共有オブジェクトに依存している場合は、-z lazyload オプションを使用してレイジー読み込みを指定する (「動的依存関係のレイジーローディング」を参照)
生成される共有オブジェクトが他の共有オブジェクトと依存関係があり、これらの共有オブジェクトが 32 ビットオブジェクト用 /usr/lib または 64 ビットオブジェクト用 /usr/lib/64 に存在しない場合は、-R オプションを使用して、そのパス名を出力ファイル内に記録する (「依存関係を持つ共有オブジェクト」を参照)
自己完結型の共有オブジェクトは、最も柔軟性が高く、オブジェクトが必要とするものすべてを自身が提供している場合に作成される。-z defs オプションを使用して、自己完結していることを確認する (「共有オブジェクトの生成」を参照)
不必要な依存性を排除する。-z ignore オプションを使用するとリンカーは、参照されたオブジェクトに対する依存性だけを記録する
このオブジェクトや関連する依存関係で割り込みシンボルが使用されない場合は、-B direct を使って直接結合情報を確立する (「外部結合」を参照)。
次に、説明したオプションを組み合わせた例を示します。
$ cc -c -o foo.o -Kpic 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 |
共有オブジェクトのパフォーマンスへの影響を考慮する。共有性を最大限にし (「共有可能性の最大化」を参照) ページング回数を最小にする (を参照)。特にシンボル再配置を最小限にすることにより、再配置の無駄を削減し (「共有オブジェクトのプロファイリング」を参照)、関数インタフェースを経由して、データにアクセスできるようにする (「コピー再配置」を参照)