リンカーとライブラリ

依存関係の並べ変え

このマニュアルで示すほとんどの例では、動的実行可能ファイルと共有オブジェクトの依存関係は、一意の比較的単純なものとして描かれています (依存共有オブジェクトの幅優先順については、「共有オブジェクトの依存関係の配置」を参照)。これらの例では、共有オブジェクトがプロセスのアドレス空間に取り込まれたときの並べ変えが、非常にわかりやすくて予測可能なものに見えるかもしれません。

しかし、動的実行可能ファイルと共有オブジェクトが同じ共通の共有オブジェクトに対して依存関係を持つ場合は、オブジェクトが処理される順序が予測困難になる可能性があります。

たとえば、共有オブジェクトの開発者が、次の依存関係を持つ 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 を構築した場合には、設定した条件は処理順序に影響を与えません。

シンボルの割り込み (「シンボルの検索」「シンボル検索」、および 「割り込み (interposition) の使用」を参照) と .init セクションの処理 (「デバッギングエイド」を参照) を特に重要視する開発者は、共有オブジェクトの処理順序でのこのような変更の可能性に注意する必要があります。