このマニュアルで示すほとんどの例では、動的実行可能ファイルと共有オブジェクトの依存関係は、一意の比較的単純なものとして描かれています (依存共有オブジェクトの幅優先の並べ変えについては、「共有オブジェクトの依存関係の配置」を参照してください)。これらの例では、共有オブジェクトがプロセスのアドレス空間に取り込まれたときの並べ変えが、非常にわかりやすくて予測可能なものにみえるかもしれません。
しかし、動的実行可能ファイルと共有オブジェクトが同じ共通の共有オブジェクトに対して依存関係を持つ場合は、オブジェクトが処理される順序が予測困難になる可能性があります。
たとえば、共有オブジェクトの開発者が、次の依存関係を持つ libfoo.so.1 を生成したものと想定します。
$ ldd libfoo.so.1 libA.so.1 => ./libA.so.1 libB.so.1 => ./libB.so.1 libC.so.1 => ./libC.so.1 |
この共有オブジェクトを使用して動的実行可能ファイル prog を作成し、libC.so.1 に対してさらに明示的な依存関係を定義すると、共有オブジェクトの順序は次のようになります。
$ cc -o prog main.c -R. -L. -lC -lfoo $ ldd prog libC.so.1 => ./libC.so.1 libfoo.so.1 => ./libfoo.so.1 libA.so.1 => ./libA.so.1 libB.so.1 => ./libB.so.1 |
したがって、共有オブジェクト libfoo.so.1 の開発者がその依存関係の処理順序にある条件を設定しても、動的実行可能ファイル prog を構築した場合には、設定した条件は処理順序に影響を与えません。
シンボルの挿入位置 (「シンボルの検索」、「シンボル検索」、および 「割り込みの使用」を参照) と .init セクションの処理 (「デバッギングエイド」を参照) を特に重要視する開発者は、共有オブジェクトの処理順序でのこのような変更の可能性に注意する必要があります。