要使记录的版本依赖项多于从目标文件的正常符号绑定中生成的版本依赖项,请使用 $ADDVERS 文件控制指令。本节介绍此附加绑定可能有用的情况。
在一个 libfoo.so.1 示例中,假设在 Release X+2, 中,版本定义 SUNW_1.1 分为两个标准发行版:STAND_A 和 STAND_B。要保持兼容性,必须维护 SUNW_1.1 版本定义。在本示例中,此版本定义表示为继承两个标准定义:
$ pvs -dsv libfoo.so.1 libfoo.so.1: _end; _GLOBAL_OFFSET_TABLE_; _DYNAMIC; _edata; _PROCEDURE_LINKAGE_TABLE_; _etext; SUNW_1.1: {STAND_A, STAND_B}: SUNW_1.1; SUNW_1.2: {SUNW_1.1}: bar; STAND_A: foo1; STAND_A; STAND_B: foo2; STAND_B; |
如果应用程序 prog 的唯一需求是接口符号 foo1,则此应用程序将仅依赖于版本定义 STAND_A。这将阻止在 libfoo.so.1 小于 Release X+2 的系统上运行 prog。尽管早期的发行版具有接口 foo1,但没有版本定义 STAND_A。
生成应用程序 prog 时,可以通过创建对 SUNW_1.1 的依赖性来使其要求与早期发行版一致:
$ cat mapfile libfoo.so - SUNW_1.1 $ADDVERS=SUNW_1.1; $ cat prog extern void foo1(); main() { foo1(); } $ cc -M mapfile -o prog prog.c -L. -R. -lfoo $ pvs -r prog libfoo.so.1 (SUNW_1.1); |
此显式依赖性足以涵盖实际的依赖性要求。此依赖性可满足与旧发行版的兼容性。
创建弱版本定义 (weak version definition)介绍了如何使用弱版本定义 (weak version definition) 标记内部实现更改。这些版本定义非常适用于指示针对目标文件所做的错误修复以及性能改善。如果需要弱版本,可以生成对此版本定义的显式依赖性。当错误修复或性能改善对于目标文件的正常工作至关重要时,创建此类依赖性非常重要。
在上一个 libfoo.so.1 示例中,假设在软件 Release X+3 中以弱版本定义 (weak version definition) SUNW_1.2.1 引入了错误修复:
$ pvs -dsv libfoo.so.1 libfoo.so.1: _end; _GLOBAL_OFFSET_TABLE_; _DYNAMIC; _edata; _PROCEDURE_LINKAGE_TABLE_; _etext; SUNW_1.1: {STAND_A, STAND_B}: SUNW_1.1; SUNW_1.2: {SUNW_1.1}: bar; STAND_A: foo1; STAND_A; STAND_B: foo2; STAND_B; SUNW_1.2.1 [WEAK]: {SUNW_1.2}: SUNW_1.2.1; |
通常,如果根据此共享库生成应用程序,则生成的应用程序将记录与版本定义 SUNW_1.2.1 的弱依赖性。此依赖性仅用于提供信息。如果运行时使用的 libfoo.so.1 中不存在此版本定义,则此依赖性不会导致终止应用程序。
文件控制指令 $ADDVERS 可用于生成版本定义的显式依赖性。如果此定义为弱定义,则此显式引用还会导致版本定义提升为强依赖性。
可以使用以下文件控制指令生成应用程序 prog,以强制满足 SUNW_1.2.1 接口在运行时可用的需求:
$ cat mapfile libfoo.so - SUNW_1.1 $ADDVERS=SUNW_1.2.1; $ cat prog extern void foo1(); main() { foo1(); } $ cc -M mapfile -o prog prog.c -L. -R. -lfoo $ pvs -r prog libfoo.so.1 (SUNW_1.2.1); |
生成 prog 时创建了与接口 STAND_A 的显式依赖性。由于版本定义 SUNW_1.2.1 提升为强版本,因此它也会通过依赖性 STAND_A 进行标准化。在运行时,如果找不到版本定义 SUNW_1.2.1,则会产生致命错误。
如果处理少量的依赖项,可以使用链接编辑器的 -u 选项显式绑定到某个版本定义。使用此选项可以引用版本定义符号。但是,符号引用是不可选择的。如果是处理多个依赖项(包含多个类似命名的版本定义)时,则此方法可能不足以创建显式绑定。