リンカーとライブラリ

-Bsymbolic の使用

リンカーの -Bsymbolic オプションを使用すると、シンボルの参照を共有オブジェクト内の大域定義に結合できます。このオプションは本来、実行時リンカーそのものを作成するために設計されたもので、長い歴史があるといえます。

オブジェクトのインタフェースを定義し、非公開シンボルをローカルに縮小することは、-Bsymbolic オプションを使用した実行時再配置のコストを削減する望ましい仕組みです (「シンボル範囲の縮小」を参照)。実際に、-Bsymbolic を使用すると直感的にはわからない副産物のできることがあります。

シンボリックに結合されたシンボルが割り込み (interposition) された場合、シンボリックに結合されたオブジェクトの外からのそのシンボルへの参照は、その割り込みに結合します。オブジェクトそのものはすでに内部的に結合されています。本質的に、同じ名前を持つ 2 つのシンボルは、プロセス内から参照されます。シンボリックに結合されたデータシンボルは、コピーを再配置し (「コピー再配置」を参照)、同じ割り込み状態を作成します。


注 -

シンボリックに結合された共有オブジェクトは、.dynamic エントリ DT_SYMBOLIC で表されます。このタグは情報を提供するだけで、実行時リンカーは、これらのオブジェクトからのシンボルの検索を他のオブジェクトからの場合と同じ方法で処理します。シンボリック結合はリンカーフェーズで作成されたものと想定されます。