可以在同一共享库中同时定义用于定义标准过滤器的单个接口以及用于定义辅助过滤器的单个接口。通过使用 mapfile 指令 FILTER 和 AUXILIARY 指定所需的 filtee,可以实现这种过滤器定义组合。
使用 -F 或 -f 选项将其所有接口都定义为过滤器的共享库可以是标准过滤器,也可以是辅助过滤器。
共享库可以定义单个接口以将其用作过滤器,同时还可以将目标文件的所有接口都定义为过滤器。在这种情况下,首先处理针对接口定义的单个过滤。如果无法针对单个接口过滤器建立 filtee,则针对过滤器的所有接口定义的 filtee 会在适用时提供回退。
例如,请考虑过滤器 filter.so.1。此过滤器使用链接编辑器的 -f 标志,针对 filtee filtee.so.1 将所有接口都定义为辅助过滤器。 filter.so.1 还使用 mapfile 指令 FILTER,针对 filtee foo.so.1 将单个接口 foo 定义为标准过滤器。filter.so.1 还使用 mapfile 指令 AUXILIARY,针对 filtee bar.so.1 将单个接口 bar 定义为辅助过滤器。
对 foo 的外部引用会导致处理 filtee foo.so.1。如果在 foo.so.1 中未找到 foo,则不会对过滤器执行进一步处理。在这种情况下,不会执行回退处理,因为已将 foo 定义为标准过滤器。
对 bar 的外部引用会导致处理 filtee bar.so.1。如果在 bar.so.1 中未找到 bar,则处理会回退到 filtee filtee.so.1。在这种情况下,会执行回退处理,因为已将 bar 定义为辅助过滤器。如果在 filtee.so.1 中未找到 bar,则最终会使用过滤器 filter.so.1 中的 bar 定义来解析外部引用。