リンカーとライブラリ

使用されない対象物の削除

構築中のオブジェクトによって使用されない関数やデータを保持することは無駄です。この対象物によってオブジェクトが肥大し、不必要な再配置のオーバーヘッドやそれに関連したページング動作が生じます。使用されない依存関係への参照も無駄です。これらの参照によって、ほかの共有オブジェクトの不必要な読み込みと処理が生じます。

リンカーのデバッギングトークン -D unused を使用すると、リンク編集中に使用されないセクションが表示されます。未使用として特定されるセクションは、リンク編集から削除してください。未使用セクションは、リンカーの -z ignore オプションを使用して削除できます。

リンカーは、次の条件のときに再配置可能オブジェクトのセクションを未使用であると判断します。

共有オブジェクトの外部インタフェースを定義することによって、セクションを削除するリンカーの機能を改善することができます。インタフェースを定義することによって、インタフェースの一部として定義されなかった大域シンボルは局所シンボルになります。ほかのオブジェクトから参照されていない局所シンボルは、排除の候補であると明確に識別されます。

関数やデータ変数が独自のセクションに割り当てられている場合、リンカーはこのような関数やデータ変数を個別に排除できます。このセクションの細分化は、-xF などのコンパイラオプションを使用して行います。以前のコンパイラには、関数を独自のセクションに割り当てる機能しかありませんでした。最近のコンパイラでは、-xF 構文が拡張されて、データ変数を独自のセクションに割り当てることができます。以前のコンパイラでは、-xF を使用するときには、C++ 例外処理を無効にする必要がありました。最近のコンパイラでは、この制限はなくなりました。

再配置可能オブジェクトの割り当て可能なセクションすべてが排除可能な場合、そのファイル全体がリンク編集から削除されます。

入力ファイルの排除に加えて、リンカーは使用されていない依存関係を判断できます。構築しているオブジェクトによって結合されていない場合、その依存関係は使用されていないと判断されます。未使用の依存関係の記録を排除するために、-z ignore オプションでオブジェクトを使用できます。

-z ignore オプションが適用されるのは、リンカーのコマンド行上でこのオプションのあとに指定したファイルだけです。-z ignore オプションは -z record によって取り消されます。