リンカーとライブラリ

フィルタ処理の組み合わせ

標準フィルタを定義する個別インタフェースと補助インタフェースを定義する個別インタフェースを、同一の共有オブジェクト内に定義することができます。こうしたフィルタ定義の組み合わせを実現するには、mapfile のキーワードである FILTERAUXILIARY を使って、必要な「フィルティー」を割り当てます。

-F または -f オプションを使用して自身のインタフェースのすべてをフィルタとして定義する共有オブジェクトは、標準フィルタか補助フィルタのどちらかです。

共有オブジェクトでは、個々のインタフェースをフィルタとして機能するように定義するとともに、そのオブジェクトのすべてのインタフェースをフィルタとして機能するように定義することができます。その場合、特定のインタフェースに対して定義された個別フィルタ処理が、まず処理されます。個別インタフェースフィルタに対する「フィルティー」を確立できなかった場合は、フィルタのすべてのインタフェースに対して定義された「フィルティー」が必要に応じてフォールバックを提供します。

たとえば、フィルタ filter.so.1 があるとします。このフィルタでは、すべてのインタフェースが「フィルティー」filtee.so.1 に対する補助フィルタとして機能するように、リンカーの -f フラグを使って定義されています。さらに filter.so.1 では、個別インタフェース foo が「フィルティー」foo.so.1 に対する標準フィルタとなるように、mapfile のキーワード FILTER を使って定義されています。さらに filter.so.1 では、個別インタフェース bar が「フィルティー」bar.so.1 に対する補助フィルタとなるように、mapfile のキーワード AUXILIARY を使って定義されています。

foo への外部参照が発生すると、「フィルティー」foo.so.1 が処理されます。foofoo.so.1 で見つからなかった場合、このフィルタに対する処理はそれ以上実行されません。この場合にフォールバック処理が実行されない理由は、foo が標準フィルタとして定義されているからです。

bar への外部参照が発生すると、「フィルティー」bar.so.1 が処理されます。barbar.so.1 で見つからなかった場合、「フィルティー」filtee.so.1 によるフォールバック処理が実行されます。この場合にフォールバック処理が実行される理由は、bar が補助フィルタとして定義されているからです。barfiltee.so.1 で見つからなかった場合、最終的にはフィルタ filter.so.1 内の bar の定義に基づいて外部参照が解決されます。